Цикл foreach создаёт копию полученного массива. Если вы имеете дело с большими объёмами данных, такой подход не годится по очевидной причине: снижение производительности. Итератор SPL работает по другому: он обрабатывает один элемент итерируемого списка за раз, делая это куда более эффективно, нежели foreach.
При создании поставщиков данных (data providers) итераторы помогают сделать их более эффективными, предлагаю возможности ленивой загрузки (lazy loading). «Ленивая загрузка» означает то, что фактическое получение данных из источника выполняет только тогда, когда эти данные нужны. Помимо прочего, вы получаете возможность трансформации данных перед тем, как отдавать их клиенту объекта.
$query = mysqli_query($con, "INSERT INTO sales (name, color, adress, tel) VALUES (`{$name}`, `{$color}`, `{$adress}`, `{$tel}`)");
if ( !$query )
{
var_dump(mysqli_error($con));
}
use \PhpOffice\PhpSpreadsheet\Cell\Coordinate;
// Выведет: Z
var_dump(Coordinate::stringFromColumnIndex(26));
// Выведет: R
var_dump(Coordinate::stringFromColumnIndex(18));
// Выведет 2
var_dump(Coordinate::columnIndexFromString('B'));
// Выведет 26
var_dump(Coordinate::columnIndexFromString('Z'));
/* @var float Стоимость минуты разговора, в данном случае 55 рублей 56 копеек */
$rateMinutes = 55.56;
/* @var DateTime Время начало разговора/события */
$oStartDate = new \DateTime('11.10.2017 10:37:00');
/* @var DateTime Время оконачания разговора/события */
$oEndDate = new \DateTime('11.10.2017 10:47:00');
/* @var int Длительность события в секундах */
$durationSeconds = abs($oEndDate->getTimestamp()-$oStartDate->getTimestamp());
/* @var int Длительность события в минутах, округленных в большую сторону */
$durationMinutes = round($durationSeconds/60);
/* @var float Стоимость разговора/события */
$price = $durationMinutes * $rateMinutes;
// Выводим стомость разговора/события
var_dump($price);
#-----------------------------------------------#
# Начало блока конфигурации HTTP хоста
#-----------------------------------------------#
<VirtualHost *:%httpport%>
DocumentRoot "%hostdir%"
ServerName "%host%"
ServerAlias "%host%" %aliases%
ScriptAlias /cgi-bin/ "%hostdir%/cgi-bin/"
</VirtualHost>
<Directory "E:/OpenServer/OpenServer/domains/dev">
AllowOverride All
php_admin_value mbstring.func_overload 0
</Directory>
#-----------------------------------------------#
# Начало блока конфигурации HTTP хоста
#-----------------------------------------------#
<VirtualHost *:%httpport%>
DocumentRoot "%hostdir%"
ServerName "%host%"
ServerAlias "%host%" %aliases%
ScriptAlias /cgi-bin/ "%hostdir%/cgi-bin/"
<Directory "e:\openserver\openserver\domains\cli">
AllowOverride All
php_admin_value mbstring.func_overload 0
</Directory>
<Directory "E:/OpenServer/OpenServer/domains/dev">
AllowOverride All
php_admin_value mbstring.func_overload 0
</Directory>
</VirtualHost>
Массив полей для группировки элемента. Если поля указаны, то выборка по ним группируется (при этом параметр arSelectFields будет проигнорирован), а в результат добавляется поле CNT - количество сгруппированных элементов. Если указать в качестве arGroupBy пустой массив, то метод вернет количество элементов CNT по фильтру. Группировать можно по полям элемента, а также по значениям его свойств. Для этого в качестве одного из полей группировки необходимо указать PROPERTY_, где PROPERTY_CODE - ID или символьный код свойства.
Необязательное. По умолчанию false - записи не группируются.
/* @var string Текст, в котором проводим замену*/
$str = <<<STRTEXT
[index:Звездочет]А тут хз что[/index]
Тут текст [guest]Иванов[/guest]
STRTEXT;
$oTextParser= (new TextParser($str))
->addRule("#\\[index:(.+?)\\](.*?)\\[/index\\]#ies", "indexShow('\\1', '\\2')")
->addRule("#\\[guest](.*?)\\[/guest]#ies","checkGuest('\\1')")
->parse();
/*
На выходе хочу получить:
-------------------------
Звездочет(А тут хз что)
Тут текст GUEST(Иванов)
*/
echo "<pre>";
var_dump($oTextParser->getText());
echo "</pre>";
function indexShow( $a, $b)
{
return $a."(".$b.")";
}
function checkGuest( $a )
{
return 'GUEST('.$a.')';
}
class TextParser
{
/* @var string Результат выполнения парсинга */
public $parsed;
/* @var string[] Ассоциативный список правил в формате: регулярка => функция для замены */
public $rules = [];
public function __construct( $text )
{
$this->parsed = $text;
}
/**
* Добавляет правило работы парсера
* Для использования цепочек возвращает текущий экземпляр
*
* @param string $regex
* @param string|callback $func
* @return TextParser
*/
public function addRule( $regex, $func )
{
$this->rules[ $regex ] = $func;
return $this;
}
/**
* Выполняет разброр исходного текста
* Для использования цепочек возвращает текущий экземпляр
*
* @return TextParser
*/
public function parse()
{
array_walk(
$this->rules,
function($function, $regular)
{
$this->parsed = preg_replace($regular, $function, $this->parsed);
}
);
return $this;
}
/**
* Возвращает результат парсера (или исходный текст, если был вызван до метода parse)
*
* @return string
*/
public function getText()
{
return $this->parsed;
}
}
<?php
AddEventHandler("main", "OnAdminListDisplay", "MyOnAdminContextMenuShow");
function MyOnAdminContextMenuShow(&$oAdminList)
{
/**
* $type - тип кода инфоблока, например news, events и т.д.
* $iblock - идентификатор инфоблока
*
* Если интересует каталог, то вместо tbl_iblock_list_ нужно использовать tbl_product_list_
*/
if ( $oAdminList->table_id == "tbl_iblock_list_".md5($type.".".$iblock) )
{
// полезные действия
}
}
?>
AddEventHandler("main", "OnAdminListDisplay", "MyOnAdminContextMenuShow");
function MyOnAdminContextMenuShow(&$oAdminList)
{
/**
* $type - тип кода инфоблока, например news, events и т.д.
* $iblock - идентификатор инфоблока
*
* Если интересует каталог, то вместо tbl_iblock_list_ нужно использовать tbl_product_list_
*/
if ( $oAdminList->table_id == "tbl_iblock_list_".md5("structure.4") )
{
$arActions = $oAdminList->arActions;
$arActions['alert'] = 'Ругаться!';
$oAdminList->AddGroupActionTable($arActions);
}
}
AddEventHandler("main", "OnAfterEpilog", "iblockAlert");
function iblockAlert()
{
$oRequest = \Bitrix\Main\Application::getInstance()->getContext()->getRequest();
// Проверяем, что работает только в админке
if ( $oRequest->isAdminSection() )
{
if (
// Интересуют только интерактивные запросы
$oRequest->get('mode')=='frame'
// Где передана переменна IBLOCK_ID
&& $oRequest->get('IBLOCK_ID')==4
// Соответствующие нашему action
&& $oRequest->get('action')=='alert'
)
{
/**
* Вот тут можно сделать что угодно
* Можно получить выделенные ID
* через $oRequest->get('ID')
* Если он пуст, значит действие на всех элементах инфоблока
*/
}
}
}