Last active
July 6, 2021 15:21
-
-
Save wajdijurry/a00752123134342ccc9d13a480c9f013 to your computer and use it in GitHub Desktop.
Adding item to array or change existent item position after shifting elements up or down depending on available positions
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Author:Wajdi Jurry <[email protected]> (https://github.com/wajdijurry) | |
* Gist: https://gist.github.com/wajdijurry/a00752123134342ccc9d13a480c9f013 | |
*/ | |
class ArrayManipulation | |
{ | |
private $array; | |
public function __construct(array $array) | |
{ | |
$this->array = $array; | |
} | |
/** | |
* Add/Change item position in array | |
* Shifting elements up/down depending on available positions | |
* Priority for shifting down | |
* @param int $position | |
* @param string $itemId | |
* @return array | |
*/ | |
public function addItemChangePosition(int $position, string $itemId) | |
{ | |
$max = 5; // Max number of elements in array | |
if ($position >= $max || $position < 0) { | |
exit('Wrong Position'); | |
} | |
// Remove item if exists | |
if (($key = array_search($itemId, $this->array)) !== false) { | |
unset($this->array[$key]); | |
} | |
$newArr = []; | |
if (array_key_exists($position, $this->array)) { | |
/** | |
* Determing shifting up or down | |
* Shifting up: 1, Shifting Down: -1 | |
*/ | |
$operator = (array_sum(array_keys($this->array)) >= array_sum(range($position, $max-1))) ? 1 : -1; | |
//Iterate over array, starting from $position till nonexistent element | |
for ($i = $position; $i >= $position * (-$operator); $i = $i - $operator) { | |
if (!array_key_exists($i, $this->array)) { | |
// Exit loop if element does not exist | |
break; | |
} | |
// Add items-to be shifted to $newArr | |
$newArr[$i - $operator] = $this->array[$i]; | |
// Remove from original array (avoiding duplicate) | |
unset($this->array[$i]); | |
} | |
// Merging shifted elements with non-affected elements, keys preserved | |
$this->array = $newArr + array_diff($this->array, $newArr); | |
} | |
// Add new item to array | |
$this->array[$position] = $itemId; | |
// Sort array | |
ksort($this->array, SORT_NUMERIC); | |
return $this->array; | |
} | |
} | |
// Example 1: | |
$items = [ | |
0 => 'item1', | |
1 => 'item2' | |
]; | |
print_r($items = (new ArrayManipulation($items))->addItemChangePosition(1, 'new item')); // $items = [0 => 'item1', 1 => 'new item', 2 => 'item2'] | |
// Example 2: | |
$items = [ | |
0 => 'item1', | |
3 => 'item2' | |
]; | |
print_r($items = (new ArrayManipulation($items))->addItemChangePosition(3, 'new item')); // $items = [0 => 'item1', 3 => 'new item', 4 => 'item2'] | |
// Example 3: | |
$items = [ | |
1 => 'item1', | |
2 => 'item2', | |
3 => 'item3', | |
4 => 'item4' | |
]; | |
print_r($items = (new ArrayManipulation($items))->addItemChangePosition(4, 'new item')); // $items = [0 => 'item1', 1 => 'item2', 2 => 'item3', 3 => 'item4', 4 => 'new item'] | |
// Example 3: | |
$items = [ | |
1 => 'item1', | |
2 => 'item2', | |
3 => 'item3', | |
4 => 'item4' | |
]; | |
print_r($items = (new ArrayManipulation($items, ))->addItemChangePosition(2, 'item4')); // $items = [1 => 'item1', 2 => 'item4', 3 => 'item2', 4 => 'item3'] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment