array_splice() for associative arrays

Viewed 46706

Say I have an associative array:

array(
  "color" => "red",
  "taste" => "sweet",
  "season" => "summer"
);

and I want to introduce a new element into it:

"texture" => "bumpy" 

behind the 2nd item but preserving all the array keys:

array(
  "color" => "red",
  "taste" => "sweet",
  "texture" => "bumpy", 
  "season" => "summer"
);

is there a function to do that? array_splice() won't cut it, it can work with numeric keys only.

14 Answers
function insrt_to_offest($targetArr, $toBeEmbed, $indAfter) {
    $ind = array_search($indAfter, array_keys($targetArr));
    $offset = $ind + 1;

    # Insert at offset 2    
    $newArray = array_slice($targetArr, 0, $offset, true) +
    $toBeEmbed +
    array_slice($targetArr, $offset, NULL, true); 

    return $newArray;
}


$features = array(
            "color" => "red",
            "taste" => "sweet",
            "season" => "summer"
          );

print_r($features);

$toBeEmbed = array("texture" => "bumpy");

$newArray = insrt_to_offest($features, $toBeEmbed, 'taste');

print_r($newArray);

I need to insert the new item after an item specified by key rather than the numeric index (offset), so I ended with recreating the array using foreach (inspired by dnagirl’s answer):

$new_fields = array();
foreach($original_fields as $key => $value) {
  $new_fields[$key] = $value;
  if ($key == 'the_key_before_insertion') {
    // add the inserted_key => inserted_value now
    $new_fields['inserted_key'] = 'inserted_value';
  }
}
Related