PHP: Move associative array element to beginning of array
PhpPhp Problem Overview
What would be the best method of moving any element of an associative array to the beginning of the array?
For example, say I have the following array:
$myArray = array(
'two' => 'Blah Blah Blah 2',
'three' => 'Blah Blah Blah 3',
'one' => 'Blah Blah Blah 1',
'four' => 'Blah Blah Blah 4',
'five' => 'Blah Blah Blah 5',
);
What i want to do is move the 'one' element to the beginning and end up with the following array:
$myArray = array(
'one' => 'Blah Blah Blah 1',
'two' => 'Blah Blah Blah 2',
'three' => 'Blah Blah Blah 3',
'four' => 'Blah Blah Blah 4',
'five' => 'Blah Blah Blah 5',
);
Php Solutions
Solution 1 - Php
You can use the array union operator (+
) to join the original array to a new associative array using the known key (one
).
$myArray = array('one' => $myArray['one']) + $myArray;
// or ['one' => $myArray['one']] + $myArray;
Array keys are unique, so it would be impossible for it to exist in two locations.
See further at the doc https://www.php.net/manual/en/language.operators.array.php">on Array Operators:
> The + operator returns the right-hand array appended to the left-hand array; for keys that exist in both arrays, the elements from the left-hand array will be used, and the matching elements from the right-hand array will be ignored.
Solution 2 - Php
If you have numerical array keys and want to reindex array keys, it would be better to put it into array_merge
like this:
$myArray = array_merge(array($key => $value) + $myArray );
Solution 3 - Php
A bit late, but in case anyone needs it, I created this little snippet.
function arr_push_pos($key, $value, $pos, $arr)
{
$new_arr = array();
$i = 1;
foreach ($arr as $arr_key => $arr_value)
{
if($i == $pos)
$new_arr[$key] = $value;
$new_arr[$arr_key] = $arr_value;
++$i;
}
return $new_arr;
}
Just adjust it to suit your needs, or use it and unset the index to move. Works with associative arrays too.
Solution 4 - Php
Here's another simple one-liner that gets this done using array_splice()
:
$myArray = array_splice($myArray,array_search('one',array_keys($myArray)),1) + $myArray;
Solution 5 - Php
if you have 2 arrays, 1st has elements to move to the top of 2nd array of elements, you can use
$result = \array_replace($ArrayToMoveToTop, $myArray);
Here is a code sample:
//source array
$myArray = [
'two' => 'Blah Blah Blah 2',
'three' => 'Blah Blah Blah 3',
'one' => 'Blah Blah Blah 1',
'four' => 'Blah Blah Blah 4',
'five' => 'Blah Blah Blah 5',
];
// set necessary order
$orderArray = [
'one' => '',
'two' => '',
];
//apply it
$result = \array_replace($orderArray, $myArray);
\print_r($result);
Solution 6 - Php
There's a function in the comments of the PHP manual for array_unshift which can be used to add an element, with key, to the beginning of an array:
function array_unshift_assoc(&$arr, $key, $val)
{
$arr = array_reverse($arr, true);
$arr[$key] = $val;
return array_reverse($arr, true);
}
Unset the element and reinsert it again with the above function:
$tmp = $myArray['one'];
unset($myArray['one']);
$myArray = array_unshift_assoc($myArray, 'one', $tmp);
A more general approach may be to use uksort to sort your array by keys and provide a sorting function of your own.