Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

array_walk_recursive - modify both keys and values

Tags:

php

How can you modify both keys and values with array_walk_recursive??

Here only the values are encoded

function _utf8_encode($arr){
    array_walk_recursive($arr, 'utf8_enc');

    return $arr;
}

function utf8_enc(&$value, &$key){
    $value = utf8_encode($value);
    $key = utf8_encode($key);
}
like image 758
clarkk Avatar asked Sep 20 '11 18:09

clarkk


1 Answers

This my recursive function that can change not only the values of the array as array_walk_recursive() but also the keys of the given array. It also keeps the order of the array.

/**
 * Change values and keys in the given array recursively keeping the array order.
 *
 * @param array    $_array    The original array.
 * @param callable $_callback The callback function takes 2 parameters (key, value)
 *                            and returns an array [newKey, newValue] or null if nothing has been changed.
 *
 * @return void
 */
function modifyArrayRecursive(array &$_array, callable $_callback): void
{
    $keys = \array_keys($_array);
    foreach ($keys as $keyIndex => $key) {
        $value = &$_array[$key];
        if (\is_array($value)) {
            modifyArrayRecursive($value, $_callback);
            continue;
        }

        $newKey = $key;
        $newValue = $value;
        $newPair = $_callback ($key, $value);
        if ($newPair !== null) {
            [$newKey, $newValue] = $newPair;
        }

        $keys[$keyIndex] = $newKey;
        $_array[$key] = $newValue;
    }

    $_array = \array_combine($keys, $_array);
}

/**
 * Usage example
 */
modifyArrayRecursive($keyboardArr, function ($key, $value) {
    if ($value === 'some value') {
        return ['new_key_for_this_value', $value];
    }

    return null;
});
like image 74
James Bond Avatar answered Nov 13 '22 13:11

James Bond