Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I use array_map with keys and values, but return an array with the same indexes (not int)?

I have an array such as ['id' => 1, 'name' => 'Fred'].

I want to call array_map on this array and also use the key inside the function. However, when I make a return, my keys will become int.

Simple example :

$arr = array('id' => 1, 'name' => 'Fred');
$result = array_map(
    function ($value, $key) {
        return $value;
     },
     $arr,
     array_keys($arr)
);
var_dump($result);

Basically, I want $result to be identical to $arr in this case, but it turns my string keys into ints.

like image 334
user2816456 Avatar asked Aug 26 '14 19:08

user2816456


4 Answers

Based on @Jannie Theunissen answer the correct way of getting an array_map working with key for comparing and assigning values based on second array for example is:

$result = array_combine(
 array_keys($arr), 
 array_map(function($v, $key){ return $v; }, $arr, array_keys($arr))
);

Or for optimized alternative:

$keys = array_keys($arr);
$result = array_combine(
 $keys, 
 array_map(function($v, $key){ return $v; }, $arr, $keys)
);

And with a comparison array value:

$compareArray = [/*same structure as $arr but with specific values*/];
$keys = array_keys($arr);
$result = array_combine(
 $keys, 
 array_map(function($v, $key) use ($compareArray) { 
              // recursive can be achieved here passing $v and $compareArray[$key]
              return $compareArray[$key]; 
           }, $arr, $keys)
);
like image 125
user3550312 Avatar answered Sep 19 '22 21:09

user3550312


For your requirement of "I want to call array_map" and "$result to be identical to $arr", try:

$result = array_combine(
     array_keys($arr), 
     array_map(function($v){ return $v; }, $arr)
);

Gives:

   [
     "id" => 1
     "name" => "Fred"
   ]

But heh, if all you want is identical arrays, then nothing beats this code:

$result = $arr;
like image 21
Jannie Theunissen Avatar answered Nov 11 '22 19:11

Jannie Theunissen


The closest you will get using array_map() is this:

<?php
$arr = array('id'=>1,'name'=>'Jon');

$callback = function ($key, $value) {
    return array($key => $value);
  };

$arr = array_map( $callback, array_keys($arr), $arr);
var_dump($arr);
?>

Gives:

   [
     [
       "id" => 1
     ],
     [
       "name" => "Jon"
     ]
   ]

You will be better creating your own function with a foreach inside.

like image 14
Marcos Avatar answered Nov 11 '22 18:11

Marcos


What you need is array_walk. Try this code:

$arr = array('id' => 1, 'name' => 'Fred');
array_walk(
    $arr,
    function (&$value, $key) {
        // do stuff
     }
);
print_r($arr);

Unfortunally it works not when you try to change the keys. But you can change the values when you pass them by refference.

If you have to change the keys too, check Question to array_walk-change-keys and the first answer:

like image 3
Radon8472 Avatar answered Nov 11 '22 17:11

Radon8472