phparraysfunctional-programmingarray-map

Access first level keys with array_map() without calling `array_keys()`


Is there a way of doing something like this:

$test_array = array(
    "first_key" => "first_value", 
    "second_key" => "second_value"
);

var_dump(
    array_map(
        function($a, $b) {
            return "$a loves $b";
        }, 
        array_keys($test_array), 
        array_values($test_array)
    )
);

But instead of calling array_keys and array_values, directly passing the $test_array variable?

The desired output is:

array(2) {
  [0]=>
  string(27) "first_key loves first_value"
  [1]=>
  string(29) "second_key loves second_value"
}

Solution

  • Not with array_map, as it doesn't handle keys.

    array_walk does:

    $test_array = array("first_key" => "first_value",
                        "second_key" => "second_value");
    array_walk($test_array, function(&$a, $b) { $a = "$b loves $a"; });
    var_dump($test_array);
    
    // array(2) {
    //   ["first_key"]=>
    //   string(27) "first_key loves first_value"
    //   ["second_key"]=>
    //   string(29) "second_key loves second_value"
    // }
    

    It does change the array given as parameter however, so it's not exactly functional programming (as you have the question tagged like that). Also, as pointed out in the comment, this will only change the values of the array, so the keys won't be what you specified in the question.

    You could write a function that fixes the points above yourself if you wanted to, like this:

    function mymapper($arrayparam, $valuecallback) {
      $resultarr = array();
      foreach ($arrayparam as $key => $value) {
        $resultarr[] = $valuecallback($key, $value);
      }
      return $resultarr;
    }
    
    $test_array = array("first_key" => "first_value",
                        "second_key" => "second_value");
    $new_array = mymapper($test_array, function($a, $b) { return "$a loves $b"; });
    var_dump($new_array);
    
    // array(2) {
    //   [0]=>
    //   string(27) "first_key loves first_value"
    //   [1]=>
    //   string(29) "second_key loves second_value"
    // }