Поменять местами элементы массива

Меняем местами элементы массива

Пример:

$input=array(‘a’=>1, ‘b’=>‘2’, ‘c’=>‘333’, ‘d’=>44);
move_array_element($input, ‘b’, 2);          /* сдвинуть элемент с ключом ‘b’ на 2 позиции “вперед” */
//move_array_element($input, ‘b’, -2);       /* на 2 позиции “назад” */
//move_array_element($input, ‘b’, 500);      /* на 500 позиций “вперед */
// а следующий пример уже без эффекта “пузырька”
//move_array_element($input, ‘b’, 2, false); /* поменять местами элемент ‘b’ и элемент, который находится на 2 шага “вперед” */
//exchange_array_elements($input, ‘a’, ‘d’); /* поменять местами элемент ‘a’ и ‘d’ */
print_r($input);

сами функции:

/**
* Functions for exchanging elements in array
* @author Anton Makarenko <php at ripfolio dot com>
*/
/**
* Exchange positions of 2 elements of array
*
* @version 1.0
*
* @param array &$array
* @param mexed $key_source
* @param mixed $key_target
* @return bool
*/

function exchange_array_elements(&$array, $key_source, $key_target)
{
if (empty($array) || !is_array($array))
return false;
if (($key_source==$key_target))
return false;
// find keys positions
$keys_positions=array_keys($array);
$key_source_position=array_shift(array_keys($keys_positions, $key_source));
$key_target_position=array_shift(array_keys($keys_positions, $key_target));
// exchange and sort postitions
if (($key_source_position!==null) && ($key_target_position!==null))
{
$buffer=$keys_positions[$key_source_position];
$keys_positions[$key_source_position]=$keys_positions[$key_target_position];
$keys_positions[$key_target_position]=$buffer;
ksort($keys_positions);
// write array values in new sequence
$new_array=array();
foreach ($keys_positions as $key)
{
$new_array[$key]=$array[$key];
unset($array[$key]);
}
$array=$new_array;
return true;
}
return false;
}/**
* Change element position in array with specified offset
*
* If offset extends array keys limits, the conforming outer element will be taken
* If bubble effect is on:
*         element will be gradually exchanged with neighbours until it become on its place
* If bubble effect is turned off:
*         element will just exchange positions with other in specified offset
*
* @version 1.0
*
* @param array &$array
* @param mixed $element_key
* @param int $offset
* @param bool $bubble_effect
* @return bool
*/

function move_array_element(&$array, $element_key, $offset, $bubble_effect=true)
{
if (empty($array) || !is_array($array))
return false;
if (!array_key_exists($element_key, $array))
return  false;
$offset=(int)$offset;
if ($offset===0)
return false;
// get keys and determine positions
$keys=array_keys($array);
$element_position=array_shift(array_keys($keys, $element_key));
$last_position=array_pop(array_keys($keys));
$new_position=$element_position+$offset;
if ($new_position<0)
$new_position=0;
if ($new_position>$last_position)
$new_position=$last_position;
// exchange keys
if ((abs($offset)===1) || ($bubble_effect!==true))
return exchange_array_elements($array, $keys[$element_position], $keys[$new_position]);
else
{
$offset_increment=$offset>0 ? 1 : –1;
$buffer_position=$element_position;
while ($buffer_position!==$new_position)
{
$keys=array_keys($array);
exchange_array_elements($array, $keys[$buffer_position], $keys[$buffer_position+$offset_increment]);
$buffer_position+=$offset_increment;
}
return true;
}
}

код был скопирован с сайта: http://forum.dklab.ru/viewtopic.php?t=22689

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: