78 votes

Comment renommer les clés d'un tableau en PHP ?

Lorsque je fais un var_dump sur une variable appelée $tags (un tableau multidimensionnel), j'obtiens ceci :

Array
(
    \[0\] => Array
        (
            \[name\] => tabbing
            \[url\] => tabbing
        )

    \[1\] => Array
        (
            \[name\] => tabby ridiman
            \[url\] => tabby-ridiman
        )

    \[2\] => Array
        (
            \[name\] => tables
            \[url\] => tables
        )

    \[3\] => Array
        (
            \[name\] => tabloids
            \[url\] => tabloids
        )

    \[4\] => Array
        (
            \[name\] => taco bell
            \[url\] => taco-bell
        )

    \[5\] => Array
        (
            \[name\] => tacos
            \[url\] => tacos
        )
)

Je voudrais renommer toutes les clés du tableau appelées "url" en "valeur". Quelle serait la bonne façon de procéder ?

3voto

Stephen Fraser Points 101

Cela devrait fonctionner dans la plupart des versions de PHP 4+. Les tableaux utilisant des fonctions anonymes ne sont pas supportés en dessous de la version 5.3.

De même, les exemples foreach génèrent un avertissement en cas d'utilisation d'une gestion stricte des erreurs PHP.

Voici une petite fonction de renommage de clés multidimensionnelles. Elle peut également être utilisée pour traiter des tableaux afin d'avoir les bonnes clés pour l'intégrité de votre application. Elle ne lancera pas d'erreur si une clé n'existe pas.

function multi_rename_key(&$array, $old_keys, $new_keys)
{
    if(!is_array($array)){
        ($array=="") ? $array=array() : false;
        return $array;
    }
    foreach($array as &$arr){
        if (is_array($old_keys))
        {
            foreach($new_keys as $k => $new_key)
            {
                (isset($old_keys[$k])) ? true : $old_keys[$k]=NULL;
                $arr[$new_key] = (isset($arr[$old_keys[$k]]) ? $arr[$old_keys[$k]] : null);
                unset($arr[$old_keys[$k]]);
            }
        }else{
            $arr[$new_keys] = (isset($arr[$old_keys]) ? $arr[$old_keys] : null);
            unset($arr[$old_keys]);
        }
    }
    return $array;
}

L'utilisation est simple. Vous pouvez soit changer une seule clé comme dans votre exemple :

multi_rename_key($tags, "url", "value");

ou une clé multiple plus complexe

multi_rename_key($tags, array("url","name"), array("value","title"));

Il utilise une syntaxe similaire à celle de preg_replace() où la quantité de $old_keys et $new_keys doit être la même. Cependant, si ce n'est pas le cas, une clé vide est ajoutée. Cela signifie que vous pouvez l'utiliser pour ajouter un schéma de type if à votre tableau.

Je l'utilise tout le temps, j'espère que ça aidera !

1voto

Jules Colle Points 2482

Une approche très simple pour remplacer les clés dans un tableau multidimensionnel, et peut-être même un peu dangereuse, mais qui devrait fonctionner correctement si vous avez un certain contrôle sur le tableau source :

$array = [ 'oldkey' => [ 'oldkey' => 'wow'] ];
$new_array = json_decode(str_replace('"oldkey":', '"newkey":', json_encode($array)));
print_r($new_array); // [ 'newkey' => [ 'newkey' => 'wow'] ]

0voto

Alexander Points 45
class DataHelper{

    private static function __renameArrayKeysRecursive($map = [], &$array = [], $level = 0, &$storage = []) {
        foreach ($map as $old => $new) {
            $old = preg_replace('/([\.]{1}+)$/', '', trim($old));
            if ($new) {
                if (!is_array($new)) {
                    $array[$new] = $array[$old];
                    $storage[$level][$old] = $new;
                    unset($array[$old]);
                } else {
                    if (isset($array[$old])) {
                        static::__renameArrayKeysRecursive($new, $array[$old], $level + 1, $storage);
                    } else if (isset($array[$storage[$level][$old]])) {
                        static::__renameArrayKeysRecursive($new, $array[$storage[$level][$old]], $level + 1, $storage);
                    }
                }
            }
        }
    }

    /**
     * Renames array keys. (add "." at the end of key in mapping array if you want rename multidimentional array key).
     * @param type $map
     * @param type $array
    */
    public static function renameArrayKeys($map = [], &$array = [])
    {
        $storage = [];
        static::__renameArrayKeysRecursive($map, $array, 0, $storage);
        unset($storage);
    }
}

Utilisez :

DataHelper::renameArrayKeys([
    'a' => 'b',
    'abc.' => [
       'abcd' => 'dcba'
    ]
], $yourArray);

0voto

Piterden Points 518

Il s'agit d'une question dupliquée

$json = '[   
{"product_id":"63","product_batch":"BAtch1","product_quantity":"50","product_price":"200","discount":"0","net_price":"20000"},    
{"product_id":"67","product_batch":"Batch2","product_quantity":"50","product_price":"200","discount":"0","net_price":"20000"}
]';

$array = json_decode($json, true);

$out = array_map(function ($product) {
  return array_merge([
    'price'    => $product['product_price'],
    'quantity' => $product['product_quantity'],
  ], array_flip(array_filter(array_flip($product), function ($value) {
    return $value != 'product_price' && $value != 'product_quantity';
  })));
}, $array);

var_dump($out);

https://repl.it/@Piterden/Remplacer des clés dans un tableau

0voto

Dankim Points 1

C'est ainsi que je renomme les clés, notamment avec les données qui ont été téléchargées dans une feuille de calcul :

function changeKeys($array, $new_keys) {
    $newArray = [];

    foreach($array as $row) {
        $oldKeys = array_keys($row);
        $indexedRow = [];

        foreach($new_keys as $index => $newKey)
            $indexedRow[$newKey] = isset($oldKeys[$index]) ? $row[$oldKeys[$index]] : '';

        $newArray[] = $indexedRow;
    }

    return $newArray;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X