Замена ключей в массиве Json + php

Svileff

Новичок
Подскажите пожалуйста как правильно заменить название ключей в массиве.
Есть 2 массива:
Код:
[{"results": [
        {
            "id": 33491,
            "title": "Скала Эль Пеньоль и красочный Гуатапе",
            "tagline": "Посетить одно из самых потрясающих мест Колумбии и влюбиться в сказочный город-галерею"
        },{
            "id": 33454,
            "title": "Горнолыжный Хибинский максимум",
            "tagline": "Кататься на горных лыжах или сноуборде и ловить северное сияние"
        }]
}]
Примерно так выглядит основной массив. Уровень вложение может быть разный.
Код:
[
    {
        "id_field_suppliers": "12",
        "field_value": "data",
        "field_value_suppliers": "results"
    },
    {
        "id_field_suppliers": "13",
        "field_value": "data:id",
        "field_value_suppliers": "results:id"
    },
    {
        "id_field_suppliers": "14",
        "field_value": "data:name",
        "field_value_suppliers": "results:title"
    },
    {
        "id_field_suppliers": "15",
        "field_value": "data:heading",
        "field_value_suppliers": "results:tagline"
    }
]
Эта второй массив в нем содержится информация какие ключи 1 массива надо поменять и на что.
Получить надо в итоге это:

Код:
[{"data": [
        {
            "id": 33491,
            "name": "Скала Эль Пеньоль и красочный Гуатапе",
            "heading": "Посетить одно из самых потрясающих мест Колумбии и влюбиться в сказочный город-галерею"
        },{
            "id": 33454,
            "name": "Горнолыжный Хибинский максимум",
            "heading": "Кататься на горных лыжах или сноуборде и ловить северное сияние"
        }]
}]
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
в цикле
все операции над массивами производятся в цикле
при этом если меняем структуру то проще создавать новый массив
 

Svileff

Новичок
В цикле это понятно, я не про это. У меня возникла загвоздка в ключах. Если первый я понимаю как поменять. То те которые идут в глубь date:id. Как с ними быть. Вложение может быть разное.
 

Фанат

oncle terrible
Команда форума
не понял.
а откуда здесь взялось какое-то date?

и почему уровень вложения может быть "разный"?
 

Svileff

Новичок
Основной массив это приходит API запрос и они могут приходить с разных сайтов. Мне надо все эти запроси согласно прописанному вложению (field_value_suppliers) привести к тому значению который у меня (field_value).
Код:
"field_value": "data:id",
"field_value_suppliers": "results:id"
Массивы могут быть разного вложение:
$array['results']['id'] = $value
и даже такие
$array['results']['price']['discount'] = $value

Надеюсь сейчас понятно объяснил. Вопрос заключается в том как получить значение согласно прописанному шаблону. И поменять на свой.
 

Svileff

Новичок
Накидал что то вроде этого. Но пока нужного результата не получил. Подскажите в чем ошибся или я вообще иду по ложному пути.
Код:
function changekeyname($array, $newkey, $oldkey)
{
   foreach($array as $key => $value)
   {
        if(is_array($value)){
            $array[$key] = changekeyname($value,$newkey,$oldkey);
        }else{
            for($i = 0; $i < count($newkey); ++$i) {
                $array[$newkey[$i]] =  $array[$oldkey[$i]];
            }
                
        }
    }
    return $array;   
}
$fieldSupplier; // Массив с полями замены
$apiResult = json_decode($arr);
$newArray = array();
foreach ($fieldSupplier as $item){
    $field_value = explode(':', $item['field_value']);
    $field_value_suppliers = explode(':', $item['field_value_suppliers']);
    $newArray = changekeyname($apiResult, $field_value, $field_value_suppliers);
}
 

WMix

герр M:)ller
Партнер клуба
тут попахивает некой json-scheme, но я в скорость не нагуглил, возможно своя
 

Тугай

Новичок
нужна рекрусия и путь от корня сохранять, на скорую руку как-то так
Код:
<?php
$s = <<<xxx
[{"results": [
        {
            "id": 33491,
            "title": "Скала Эль Пеньоль и красочный Гуатапе",
            "tagline": "Посетить одно из самых потрясающих мест Колумбии и влюбиться в сказочный город-галерею"
        },{
            "id": 33454,
            "title": "Горнолыжный Хибинский максимум",
            "tagline": "Кататься на горных лыжах или сноуборде и ловить северное сияние"
        }]
}]
xxx;

$m = <<<zzz
[
    {
        "id_field_suppliers": "12",
        "field_value": "data",
        "field_value_suppliers": "results"
    },
    {
        "id_field_suppliers": "13",
        "field_value": "data:id",
        "field_value_suppliers": "results:id"
    },
    {
        "id_field_suppliers": "14",
        "field_value": "data:name",
        "field_value_suppliers": "results:title"
    },
    {
        "id_field_suppliers": "15",
        "field_value": "data:heading",
        "field_value_suppliers": "results:tagline"
    }
]
zzz;

$j = json_decode($s, true);
$map = json_decode($m, true);

function map_key($root)
{
    global $map;
    
    foreach($map as $item) {
        if ($item['field_value_suppliers'] == $root) {
            $p = explode(':', $item['field_value']);
            
            return $p[count($p) -1];
        }
        
    }
    
    return 'error';
}

function parse($root_base, $j, &$r) {
    foreach($j as $k => $v) {

        if (is_numeric($k)) {
            $r[$k] = array();
            parse($root_base, $j[$k], $r[$k]);
        } else {
            $root = empty($root_base) ? $k : $root_base . ':' . $k;
            
            if (is_array($j[$k])) {
                $mk = map_key($root);
                $r[$mk] = array();
                parse($root, $j[$k], $r[$mk]);
            } else {
                $r[map_key($root)] = $j[$k];
            }
        }
    }
}
$r = array();
parse('', $j, $r);
print_r(json_encode($r, JSON_UNESCAPED_UNICODE));
 

Svileff

Новичок
нужна рекрусия и путь от корня сохранять, на скорую руку как-то так
Код:
<?php
$s = <<<xxx
[{"results": [
        {
            "id": 33491,
            "title": "Скала Эль Пеньоль и красочный Гуатапе",
            "tagline": "Посетить одно из самых потрясающих мест Колумбии и влюбиться в сказочный город-галерею"
        },{
            "id": 33454,
            "title": "Горнолыжный Хибинский максимум",
            "tagline": "Кататься на горных лыжах или сноуборде и ловить северное сияние"
        }]
}]
xxx;

$m = <<<zzz
[
    {
        "id_field_suppliers": "12",
        "field_value": "data",
        "field_value_suppliers": "results"
    },
    {
        "id_field_suppliers": "13",
        "field_value": "data:id",
        "field_value_suppliers": "results:id"
    },
    {
        "id_field_suppliers": "14",
        "field_value": "data:name",
        "field_value_suppliers": "results:title"
    },
    {
        "id_field_suppliers": "15",
        "field_value": "data:heading",
        "field_value_suppliers": "results:tagline"
    }
]
zzz;

$j = json_decode($s, true);
$map = json_decode($m, true);

function map_key($root)
{
    global $map;
 
    foreach($map as $item) {
        if ($item['field_value_suppliers'] == $root) {
            $p = explode(':', $item['field_value']);
         
            return $p[count($p) -1];
        }
     
    }
 
    return 'error';
}

function parse($root_base, $j, &$r) {
    foreach($j as $k => $v) {

        if (is_numeric($k)) {
            $r[$k] = array();
            parse($root_base, $j[$k], $r[$k]);
        } else {
            $root = empty($root_base) ? $k : $root_base . ':' . $k;
         
            if (is_array($j[$k])) {
                $mk = map_key($root);
                $r[$mk] = array();
                parse($root, $j[$k], $r[$mk]);
            } else {
                $r[map_key($root)] = $j[$k];
            }
        }
    }
}
$r = array();
parse('', $j, $r);
print_r(json_encode($r, JSON_UNESCAPED_UNICODE));
Спасибо, почему-то map_key() возвращает " " пока не могу понять почему
 
Последнее редактирование:

Svileff

Новичок
Вот что получаю
Код:
{
    "": null,
    "data": [
        {
            "id": 33590,
            "eTitle": "Весенний Алтай за 4 дня",
            "": 2
        },
        {
            "id": 32903,
            "eTitle": "Настоящий Бангкок: обстоятельное знакомство с городом",
            "": 1
        }
    ]
}
Все правильно работает, только "" откуда то берется
 

Тугай

Новичок
простая логика: найти совпадение с field_value_suppliers и вязть поcледний компонет из
field_value, если не находит возвращает 'error' как ключ. Проверяй свои данные, видимо у тебя не заполнены все field_value и там что-то вроде "data:"
 
Сверху