PHP / MYSQL Заменить текст ключей в массиве словарей - PullRequest
0 голосов
/ 21 июня 2019

У меня есть запрос MYSQL, который выбирает массив словарей или результатов, которые возвращаются через JSON в API.В некоторых случаях я хотел бы изменить имя словарных ключей в массиве результатов.

Например, в следующем случае:

$var = '[{"player":"Tiger Woods"},{"player":"Gary Player"}]';

Я хотел бы изменить его на:

$var = '[{"golfer":"Tiger Woods"},{"golfer":"Gary Player"}]'

В этом случае нецелесообразно менять запрос mysql, поэтому я просто хотел бы заменить слово «игрок» словом «игрок в гольф» для клавиш без изменения значений.

В приведенном выше примере я бы не хотел менять имя Gary Player, поэтому просто использование str_replace не похоже на то, что это будет работать.

Есть ли способ изменить все ключи с "игрок "в" игрок в гольф ", не меняя значения?

Ответы [ 3 ]

4 голосов
/ 21 июня 2019

Вот фрагмент кода, который вы можете использовать

$var = '[{"player":"Tiger Woods"},{"player":"Gary Player"}]';
// json decode the json string
$temp = json_decode($var, true);
$temp = array_map(function($item){
    // combining key and values
    return array_combine(['golfer'], $item);
}, $temp);
print_r($temp);
// or echo json_encode($temp);

Демо .

Некоторые утверждают, что foreach самый быстрый,

foreach($temp as $k => &$v){
     $v = array_combine(['golfer'], $v);
}
print_r($temp);

Демо .

Немного жестко закодировано, если в одном массиве несколько ключей,

foreach ($temp as $k => &$v){
  $v['golfer'] = $v['player'];
  unset($v['player']);
}
print_r($temp);

Демо .

Использование рекурсии

function custom($arr, $newKey, $oldKey)
{
    // if the value is not an array, then you have reached the deepest
    // point of the branch, so return the value
    if (!is_array($arr)) {
        return $arr;
    }

    $result = []; // empty array to hold copy of subject
    foreach ($arr as $key => $value) {
        // replace the key with the new key only if it is the old key
        $key = ($key === $oldKey) ? $newKey : $key;
        // add the value with the recursive call
        $result[$key] = custom($value, $newKey, $oldKey);
    }
    return $result;
}
$var  = '[{"player":"Tiger Woods"},{"player":"Gary Player"}]';
$temp = json_decode($var, true);
$temp = replaceKey($temp, 'golfer', 'player');
print_r($temp);

Демо & источник .

Используя json way,

function json_change_key($arr, $oldkey, $newkey) {
    $json = str_replace('"'.$oldkey.'":', '"'.$newkey.'":', json_encode($arr));
    return json_decode($json, true);    
}
$temp = json_change_key($temp, 'player', 'golfer');
print_r($temp);

Демо
Если вы хотите заменить несколько ключей, вот трюк,

$var = '[{"player":"Tiger Woods", "wins":"10","losses":"3"},{"player":"Gary Player","wins":"7", "losses":6}]';
$temp = json_decode($var, true);
function recursive_change_key($arr, $set)
{
    if (is_array($arr) && is_array($set)) {
        $newArr = [];
        foreach ($arr as $k => $v) {
            $key          = array_key_exists($k, $set) ? $set[$k] : $k;
            $newArr[$key] = is_array($v) ? recursive_change_key($v, $set) : $v;
        }
        return $newArr;
    }
    return $arr;
}
$set = [
    "player" => "golfers",
    "wins" => "victories",
    "losses" => "defeats"
    ];
$temp = recursive_change_key($temp, $set);
print_r($temp);

Демо .

3 голосов
/ 21 июня 2019
$a = '[{"player":"Tiger Woods"},{"player":"Gary Player"}]';

$array = json_decode($a, true);


foreach($array as $key=>$value){

    if(array_keys($value)[0] === "player"){
        $array[$key] = ["golfer" => array_values($value)[0]];
    };

}   

echo json_encode($array);
0 голосов
/ 21 июня 2019

вы можете записать значение ключа в новый ключ, а затем удалить старый.

переименование ключа с именем "a" в "b" с сохранением значения.


var json = {
    "a" : "one"
}

json["b"] = json["a"];
delete json["a"];

для вашего примера, просто используйте это с циклом.

источник: https://sciter.com/forums/topic/how-to-rename-the-key-of-json/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...