• Модуль: 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));
	}
}