Как я могу объединить 2 URL-адреса .json?

Какую функцию я могу использовать для соединения 2 данных .json вместе?

По сути, у меня есть:

https://api.coinmarketcap.com/v2/ticker/?limit=1&start=1 а также https://api.coinmarketcap.com/v2/ticker/?limit=1&start=2

Я хочу соединить сегмент «данные» вместе, чтобы он выглядел как объединенный. Какую функцию php я могу использовать? Так что я могу узнать об этом.

$sources = array(1,2);
foreach ($sources as $sourcenum) {
  $source = "https://api.coinmarketcap.com/v2/ticker/?limit=2&start = ".$sourcenum;
  $source_json = file_get_contents($source);
  $source_array = json_decode($source_json, TRUE);
  #I'm stuck here. How would I copy all the data and chuck it into my own file  called www.example.com/concatenated_data
#then keep concatenating in the next loop 
}

Тогда в моих concatenated_data это будет выглядеть так:

{
    "data": {
        "1": {
            "id": 1, 
            "name": "Bitcoin", 
            "symbol": "BTC", 
            "website_slug": "bitcoin", 
            "rank": 1, 
            "circulating_supply": 17309562.0, 
            "total_supply": 17309562.0, 
            "max_supply": 21000000.0, 
            "quotes": {
                "USD": {
                    "price": 6576.52005708, 
                    "volume_24h": 3304276557.4679, 
                    "market_cap": 113836681672.0, 
                    "percent_change_1h": -0.52, 
                    "percent_change_24h": -0.33, 
                    "percent_change_7d": -0.52
                }
            }, 
            "last_updated": 1538915062
        }, 
        "1027": {
            "id": 1027, 
            "name": "Ethereum", 
            "symbol": "ETH", 
            "website_slug": "ethereum", 
            "rank": 2, 
            "circulating_supply": 102421710.0, 
            "total_supply": 102421710.0, 
            "max_supply": null, 
            "quotes": {
                "USD": {
                    "price": 223.312150803, 
                    "volume_24h": 1527251449.77882, 
                    "market_cap": 22872012419.0, 
                    "percent_change_1h": -0.14, 
                    "percent_change_24h": -1.19, 
                    "percent_change_7d": -4.63
                }
            }, 
            "last_updated": 1538915014
        }
    }, 
}

json_decode их обоих, добавьте желаемые значения от второго к первому. json_encode еще раз, если необходимо.

Jeff 07.10.2018 14:28

@Jeff Я декодирую оба URL-адреса, но как мне соединить их вместе?

Yuri 07.10.2018 14:32

@Yuri Немного зависит от данных, но что-то вроде array_merge, скорее всего, поможет.

ceejayoz 07.10.2018 15:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
339
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это то, что вы хотите, просто создайте переменную массива $result и отправьте на нее весь ответ. Вот оно :)

<?php
$sources = array(1,2);
$result = [];
foreach ($sources as $sourcenum) {
  $source = "https://api.coinmarketcap.com/v2/ticker/?limit=2&start=$sourcenum";
  $source_json = file_get_contents($source);
   $result[] = json_decode($source_json, TRUE); // push the response to $result
}

echo '<pre>';
print_r($result); // just for debug purpose
echo '</pre>';
echo json_encode($result);
?>

Отредактировано: согласно новым требованиям OP

<?php
$sources = array(1,2);
$result = $required =  [];
foreach ($sources as $sourcenum) {
    $source = "https://api.coinmarketcap.com/v2/ticker/?limit=2&start=$sourcenum";
    $source_json = file_get_contents($source);
    $source_array = json_decode($source_json, TRUE);
    $result[] = $source_array['data'];
}
//print_r($result); // comment out to see what is inside it
foreach($result as $k=>$v){
    foreach($v as $key=>$value){
        $required[$value['name']] = $value['quotes']['USD']['price'];
    }
}
//print_r($required); // comment out to see what is inside it
$mydata=json_encode($required);
file_put_contents("mydata.txt",$mydata); // assumet mydata.txt is on the same directory
?>

Как мне получить доступ к определенным частям? Например данные-> 1-> котировки-> usd-> цена?

Yuri 07.10.2018 14:36

для одного. это будет работать, потому что вы только что сделали его array, а декодировали его echo $result[0]['data'][1]['quotes']['USD']['price'];, но чтобы получить несколько price, вы должны использовать foreach()

Always Sunny 07.10.2018 14:37

@Yuri Если вам нужно что-то еще, например, конкретное значение / ключ, пожалуйста, дайте мне знать. Я могу вам помочь :)

Always Sunny 07.10.2018 14:45

Ну ладно, все будет так же. Я был немного сбит с толку, потому что новый $result выглядел иначе, чем исходник. Вот как я и раньше к нему обращался. У меня есть еще 2 вопроса. Вопрос 1: Как я могу объединить только определенные вещи, такие как имя и цена? Вопрос 2: Как я могу поместить эти объединенные данные в новый файл с именем mydata

Yuri 07.10.2018 14:50

Привет, @Yuri, я добавил ответ на пару твоих вопросов. Надеюсь, это тебе поможет. Удачи :)

Always Sunny 07.10.2018 15:01

И последнее, что вы сделали: вы назвали 'name' ключом, а цену словарём? Если бы я хотел взять несколько вещей, например, название, цену и символ, это не сработало бы, верно? потому что у нас может быть только имя и словарь?

Yuri 07.10.2018 15:07

@Yuri, вы можете легко получить несколько вещей, таких как имя, цена и символ. Можете ли вы поделиться своими ожидаемыми данными, которые вы хотите сохранить в файле mydata?

Always Sunny 07.10.2018 15:11

это нормально? {"1":["Bitcoin","BTC",6565.2431582],"1027":["Ethereum","ETH"‌​,223.625707893],"52"‌​:["XRP","XRP",0.4774‌​902176]} для этого, просто используйте $required[$value['id']] = [$value['name'],$value['symbol'],$value['quotes']['USD']['pr‌​ice']]; вместо старого кода. Здесь я вставил name, symbol и price в id.

Always Sunny 07.10.2018 15:13

ну, у меня нет ожидаемых данных. Я просто пытаюсь учиться, поэтому применяю себя и пробую крутые вещи. Например, я хочу, чтобы мои данные содержали name, symbol, rank и price. Думаю, как только я пойму, как получить несколько вещей и хранить их, это будет. Я правильно пойму, как манипулировать данными

Yuri 07.10.2018 15:15

Я только что посмотрел на новый код, который вы прокомментировали. Есть ли способ на самом деле сказать "name" = "Bitcoin";, "Symbol" = "BTC"; и т. д.

Yuri 07.10.2018 15:16

@Yuri звучит круто !! вы пытаетесь учиться, да, эту структуру можно создать. Он вызывает ассоциативный массив.

Always Sunny 07.10.2018 15:17

Я хочу, чтобы он был в том же формате, что и исходный, поэтому, когда я печатаю данные в mydata.json, я могу получить доступ к отдельным данным таким же образом. Я видел, что использование функции file_get_contents неэффективно. Итак, я пытаюсь научиться кэшировать.

Yuri 07.10.2018 15:19

Чтобы сделать его ассоциативным, вы можете использовать $required[$value['id']] = ['name'=>$value['name'],'symbol'=>$value['symbol'],'rank'=>$‌​value['rank'],'price‌​'=>$value['quotes'][‌​'USD']['price']];, кстати. Да, я согласен, вы также можете использовать fwrite() или другие функции для кеширования / записи, но я предпочитаю file_put_contents(), так что это не имеет большого значения. Удачного кодирования :)

Always Sunny 07.10.2018 15:21

Большое спасибо. Я думаю, что теперь у меня это получается

Yuri 07.10.2018 15:27

Это должно делать то, что вы хотите, если я правильно понял, что вы хотите:

$sources = array(1,2);
$target = ["data": []]; // pre-build the target output as blueprint
foreach ($sources as $sourcenum) {
  $source = "https://api.coinmarketcap.com/v2/ticker/?limit=2&start=$sourcenum";
  $source_json = file_get_contents($source);
  $source_array = json_decode($source_json, TRUE);
  // add the (first and only?) found data item with it's key to the pre-built target
  $keys = array_keys($source_array['data']);
  $target['data'][$keys[0]] = $source_array['data'][$keys[0]];
}
echo json_encode($target);

// OUTPUT
{
    "data": {
        "1027": {
            "id": 1027,
            "name": "Ethereum",
            "symbol": "ETH",
            "website_slug": "ethereum",
            "rank": 2,
            "circulating_supply": 102421710,
            "total_supply": 102421710,
            "max_supply": null,
            "quotes": {
                "USD": {
                    "price": 223.378253997,
                    "volume_24h": 1539026622.1182,
                    "market_cap": 22878782821,
                    "percent_change_1h": -0.09,
                    "percent_change_24h": -1.13,
                    "percent_change_7d": -4.6
                }
            },
            "last_updated": 1538915312
        },
        "1": {
            "id": 1,
            "name": "Bitcoin",
            "symbol": "BTC",
            "website_slug": "bitcoin",
            "rank": 1,
            "circulating_supply": 17309562,
            "total_supply": 17309562,
            "max_supply": 21000000,
            "quotes": {
                "USD": {
                    "price": 6577.6247973,
                    "volume_24h": 3306420413.0069,
                    "market_cap": 113855804242,
                    "percent_change_1h": -0.5,
                    "percent_change_24h": -0.32,
                    "percent_change_7d": -0.5
                }
            },
            "last_updated": 1538915245
        }
    }
}

Я оставил метаданные на данный момент, потому что неясно, как вы хотели бы поступить с этим.

Другие вопросы по теме