Какую функцию я могу использовать для соединения 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
}
},
}
@Jeff Я декодирую оба URL-адреса, но как мне соединить их вместе?
@Yuri Немного зависит от данных, но что-то вроде array_merge, скорее всего, поможет.






Это то, что вы хотите, просто создайте переменную массива $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-> цена?
для одного. это будет работать, потому что вы только что сделали его array, а декодировали его echo $result[0]['data'][1]['quotes']['USD']['price'];, но чтобы получить несколько price, вы должны использовать foreach()
@Yuri Если вам нужно что-то еще, например, конкретное значение / ключ, пожалуйста, дайте мне знать. Я могу вам помочь :)
Ну ладно, все будет так же. Я был немного сбит с толку, потому что новый $result выглядел иначе, чем исходник. Вот как я и раньше к нему обращался. У меня есть еще 2 вопроса. Вопрос 1: Как я могу объединить только определенные вещи, такие как имя и цена? Вопрос 2: Как я могу поместить эти объединенные данные в новый файл с именем mydata
Привет, @Yuri, я добавил ответ на пару твоих вопросов. Надеюсь, это тебе поможет. Удачи :)
И последнее, что вы сделали: вы назвали 'name' ключом, а цену словарём? Если бы я хотел взять несколько вещей, например, название, цену и символ, это не сработало бы, верно? потому что у нас может быть только имя и словарь?
@Yuri, вы можете легко получить несколько вещей, таких как имя, цена и символ. Можете ли вы поделиться своими ожидаемыми данными, которые вы хотите сохранить в файле mydata?
это нормально? {"1":["Bitcoin","BTC",6565.2431582],"1027":["Ethereum","ETH",223.625707893],"52":["XRP","XRP",0.4774902176]} для этого, просто используйте $required[$value['id']] = [$value['name'],$value['symbol'],$value['quotes']['USD']['price']]; вместо старого кода. Здесь я вставил name, symbol и price в id.
ну, у меня нет ожидаемых данных. Я просто пытаюсь учиться, поэтому применяю себя и пробую крутые вещи. Например, я хочу, чтобы мои данные содержали name, symbol, rank и price. Думаю, как только я пойму, как получить несколько вещей и хранить их, это будет. Я правильно пойму, как манипулировать данными
Я только что посмотрел на новый код, который вы прокомментировали. Есть ли способ на самом деле сказать "name" = "Bitcoin";, "Symbol" = "BTC"; и т. д.
@Yuri звучит круто !! вы пытаетесь учиться, да, эту структуру можно создать. Он вызывает ассоциативный массив.
Я хочу, чтобы он был в том же формате, что и исходный, поэтому, когда я печатаю данные в mydata.json, я могу получить доступ к отдельным данным таким же образом. Я видел, что использование функции file_get_contents неэффективно. Итак, я пытаюсь научиться кэшировать.
Чтобы сделать его ассоциативным, вы можете использовать $required[$value['id']] = ['name'=>$value['name'],'symbol'=>$value['symbol'],'rank'=>$value['rank'],'price'=>$value['quotes']['USD']['price']];, кстати. Да, я согласен, вы также можете использовать fwrite() или другие функции для кеширования / записи, но я предпочитаю file_put_contents(), так что это не имеет большого значения. Удачного кодирования :)
Большое спасибо. Я думаю, что теперь у меня это получается
Это должно делать то, что вы хотите, если я правильно понял, что вы хотите:
$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
}
}
}
Я оставил метаданные на данный момент, потому что неясно, как вы хотели бы поступить с этим.
json_decode их обоих, добавьте желаемые значения от второго к первому. json_encode еще раз, если необходимо.