Подтвердить что ты не робот

Как переименовать ключи массива в PHP?

Когда я var_dump для переменной с именем $tags (многомерный массив), я получаю следующее:

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
        )
)

Я хотел бы переименовать все ключи массивов под названием "url", которые будут называться "value". Что было бы хорошим способом сделать это?

4b9b3361

Ответ 1

Вы можете использовать array_map(), чтобы сделать это.

$tags = array_map(function($tag) {
    return array(
        'name' => $tag['name'],
        'value' => $tag['url']
    );
}, $tags);

Ответ 2

Прокрутите, установите новый ключ, отмените старый ключ.

foreach($tags as &$val){
    $val['value'] = $val['url'];
    unset($val['url']);
}

Ответ 3

вы можете сделать что-то вроде этого

foreach($tags as &$tag){
    $tag['value'] = $tag['url'];
    unset($tag['url']);
}

Ответ 4

Говоря о функциональном PHP, у меня есть более общий ответ:

    array_map(function($arr){
        $ret = $arr;
        $ret['value'] = $ret['url'];
        unset($ret['url']);
        return $ret;
    }, $tag);
}

Ответ 5

Это должно работать в большинстве версий PHP 4+. Карта массива с использованием анонимных функций не поддерживается ниже 5.3.

Кроме того, примеры foreach выдают предупреждение при использовании строгой обработки ошибок PHP.

Вот небольшая многомерная функция переименования клавиш. Он также может использоваться для обработки массивов, чтобы иметь правильные ключи для целостности во всем приложении. Он не будет вызывать ошибок, если ключ не существует.

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;
}

Использование прост. Вы можете либо сменить один ключ, как в вашем примере:

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

или более сложный multikey

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

Он использует аналогичный синтаксис как preg_replace(), где количество $old_keys и $new_keys должно быть одинаковым. Однако, когда они не являются пустым ключом, добавляется. Это означает, что вы можете использовать его для добавления сортировки, если схема в ваш массив.

Используйте это все время, надеюсь, что это поможет!

Ответ 6

foreach ($basearr as &$row)
{
$row['value'] = $row['url'];
unset( $row['url'] );
}

Ответ 7

Функция рекурсивных переименований php:

function replaceKeys($oldKey, $newKey, array $input){
    $return = array(); 
    foreach ($input as $key => $value) {
        if ($key===$oldKey)
            $key = $newKey;

        if (is_array($value))
            $value = replaceKeys( $oldKey, $newKey, $value);

        $return[$key] = $value;
    }
    return $return; 
}

Ответ 8

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);
    }
}

Использование:

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

Ответ 9

Это из дублированного вопроса

$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/Replace-keys-in-array