You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

147 lines
4.8 KiB

<?php
/**
* The Horde_Array:: class provides various methods for array manipulation.
*
* Copyright 2003-2017 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (LGPL). If you
* did not receive this file, see http://www.horde.org/licenses/lgpl21.
*
* @author Michael Slusarz <slusarz@horde.org>
* @author Marko Djukic <marko@oblo.com>
* @author Jan Schneider <jan@horde.org>
* @category Horde
* @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
* @package Util
*/
class Horde_Array
{
/**
* Sorts an array on a specified key. If the key does not exist,
* defaults to the first key of the array.
*
* @param array &$array The array to be sorted, passed by reference.
* @param string $key The key by which to sort. If not specified then
* the first key is used.
* @param integer $dir Sort direction:
* 0 = ascending (default)
* 1 = descending
* @param boolean $assoc Keep key value association?
*/
public static function arraySort(array &$array, $key = null, $dir = 0,
$assoc = true)
{
/* Return if the array is empty. */
if (empty($array)) {
return;
}
/* If no key to sort by is specified, use the first key of the
* first element. */
if (is_null($key)) {
$keys = array_keys(reset($array));
$key = array_shift($keys);
}
/* Call the appropriate sort function. */
$helper = new Horde_Array_Sort_Helper();
$helper->key = $key;
$function = $dir ? 'reverseCompare' : 'compare';
if ($assoc) {
uasort($array, array($helper, $function));
} else {
usort($array, array($helper, $function));
}
}
/**
* Given an HTML type array field "example[key1][key2][key3]" breaks up
* the keys so that they could be used to reference a regular PHP array.
*
* @param string $field The field name to be examined.
* @param string &$base Will be set to the base element.
* @param array &$keys Will be set to the list of keys.
*
* @return boolean True on sucess, false on error.
*/
public static function getArrayParts($field, &$base, &$keys)
{
if (!preg_match('|([^\[]*)((\[[^\[\]]*\])+)|', $field, $matches)) {
return false;
}
$base = $matches[1];
$keys = explode('][', $matches[2]);
$keys[0] = substr($keys[0], 1);
$keys[count($keys) - 1] = substr($keys[count($keys) - 1], 0, strlen($keys[count($keys) - 1]) - 1);
return true;
}
/**
* Using an array of keys iterate through the array following the
* keys to find the final key value. If a value is passed then set
* that value.
*
* @param array &$array The array to be used.
* @param array &$keys The key path to follow as an array.
* @param array $value If set the target element will have this value set
* to it.
*
* @return mixed The final value of the key path.
*/
public static function getElement(&$array, array &$keys, $value = null)
{
if (count($keys)) {
$key = array_shift($keys);
return isset($array[$key])
? self::getElement($array[$key], $keys, $value)
: false;
}
if (!is_null($value)) {
$array = $value;
}
return $array;
}
/**
* Returns a rectangle of a two-dimensional array.
*
* @param array $array The array to extract the rectangle from.
* @param integer $row The start row of the rectangle.
* @param integer $col The start column of the rectangle.
* @param integer $height The height of the rectangle.
* @param integer $width The width of the rectangle.
*
* @return array The extracted rectangle.
*/
public static function getRectangle(array $array, $row, $col, $height,
$width)
{
$rec = array();
for ($y = $row; $y < $row + $height; $y++) {
$rec[] = array_slice($array[$y], $col, $width);
}
return $rec;
}
/**
* Given an array, returns an associative array with each element key
* derived from its value.
* For example:
* array(0 => 'foo', 1 => 'bar')
* would become:
* array('foo' => 'foo', 'bar' => 'bar')
*
* @param array $array An array of values.
*
* @return array An array with keys the same as values.
*/
public static function valuesToKeys(array $array)
{
return $array
? array_combine($array, $array)
: array();
}
}