- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/lib/type/collection.php
- Класс: BitrixMainTypeCollection
- Вызов: Collection::sortByColumn
static function sortByColumn(array &$array, $columns, $callbacks = '', $defaultValueIfNotSetValue = null, $preserveKeys = false)
{
//by default: sort by ASC
if (!is_array($columns))
{
$columns = array($columns => SORT_ASC);
}
$params = $preserveDataKeys = array();
$alreadyFillPreserveDataKeys = false;
foreach ($columns as $column => &$order)
{
$callback = null;
//this is an array of callbacks (callable string)
if(is_array($callbacks) && !is_callable($callbacks))
{
//if callback set for column
if(!empty($callbacks[$column]))
{
$callback = is_callable($callbacks[$column])? $callbacks[$column] : false;
}
}
//common callback
elseif(!empty($callbacks))
{
$callback = is_callable($callbacks)? $callbacks : false;
}
if($callback === false)
{
throw new BitrixMainArgumentOutOfRangeException('callbacks');
}
//this is similar to the index|slice
$valueColumn[$column] = array();
foreach ($array as $index => $row)
{
$value = $row[$column] ?? $defaultValueIfNotSetValue;
if ($callback)
{
$value = call_user_func_array($callback, array($value));
}
$valueColumn[$column][$index] = $value;
if($preserveKeys && !$alreadyFillPreserveDataKeys)
{
$preserveDataKeys[$index] = $index;
}
}
unset($row, $index);
$alreadyFillPreserveDataKeys = $preserveKeys && !empty($preserveDataKeys);
//bug in 5.3 call_user_func_array
$params[] = &$valueColumn[$column];
$order = (array)$order;
foreach ($order as $i => $ord)
{
$params[] = &$columns[$column][$i];
}
}
unset($order, $column);
$params[] = &$array;
if($preserveKeys)
{
$params[] = &$preserveDataKeys;
}
call_user_func_array('array_multisort', $params);
if($preserveKeys)
{
$array = array_combine(array_values($preserveDataKeys), array_values($array));
}
}