2016-09-15 2 views
-1

У меня есть вывод this site's, который дает мне значение 750+ altcoins.Как получить конкретную запись из файла JSON в PHP

Я получаю выход и декодирую его как $data.

Давайте упростим его:

[ 
    { 
     "id": "bitcoin", 
     "name": "Bitcoin", 
     "symbol": "BTC", 
     "rank": "1", 
     "price_usd": "610.561", 
     "price_btc": "1.0", 
     "24h_volume_usd": "44104400.0", 
     "market_cap_usd": "9688885050.0", 
     "available_supply": "15868824.0", 
     "total_supply": "15868824.0", 
     "percent_change_1h": "0.12", 
     "percent_change_24h": "0.25", 
     "percent_change_7d": "-1.61", 
     "last_updated": "1473929966" 
    }, 
    { 
     "id": "ethereum", 
     "name": "Ethereum", 
     "symbol": "ETH", 
     "rank": "2", 
     "price_usd": "12.0793", 
     "price_btc": "0.0197864", 
     "24h_volume_usd": "8171040.0", 
     "market_cap_usd": "1014555388.0", 
     "available_supply": "83991240.0", 
     "total_supply": "83991240.0", 
     "percent_change_1h": "0.21", 
     "percent_change_24h": "1.25", 
     "percent_change_7d": "4.92", 
     "last_updated": "1473929962" 
    }, 
    { 
     "id": "ripple", 
     "name": "Ripple", 
     "symbol": "XRP", 
     "rank": "3", 
     "price_usd": "0.00597615", 
     "price_btc": "0.00000979", 
     "24h_volume_usd": "1017240.0", 
     "market_cap_usd": "211062429.0", 
     "available_supply": "35317458440.0", 
     "total_supply": "99997205581.0", 
     "percent_change_1h": "-0.16", 
     "percent_change_24h": "1.53", 
     "percent_change_7d": "0.88", 
     "last_updated": "1473929942" 
    }, 
    { 
     "id": "litecoin", 
     "name": "Litecoin", 
     "symbol": "LTC", 
     "rank": "4", 
     "price_usd": "3.83018", 
     "price_btc": "0.00627398", 
     "24h_volume_usd": "1101600.0", 
     "market_cap_usd": "182184060.0", 
     "available_supply": "47565404.0", 
     "total_supply": "47565404.0", 
     "percent_change_1h": "-0.11", 
     "percent_change_24h": "0.14", 
     "percent_change_7d": "-3.61", 
     "last_updated": "1473929943" 
    }, 
    { 
     "id": "monero", 
     "name": "Monero", 
     "symbol": "XMR", 
     "rank": "5", 
     "price_usd": "10.4646", 
     "price_btc": "0.0171415", 
     "24h_volume_usd": "4920040.0", 
     "market_cap_usd": "134987751.0", 
     "available_supply": "12899466.0", 
     "total_supply": "12899466.0", 
     "percent_change_1h": "-0.35", 
     "percent_change_24h": "-2.47", 
     "percent_change_7d": "-14.04", 
     "last_updated": "1473929949" 
    }, 
] 

Как получить price_usd из скажем, пульсации? Я знаю, что могу делать $data[3]['price_usd'], однако информация основана на ранге. Ранг меняется. Как получить его для получения значения пульсации без использования [1]? Я пробовал $data['bitcoin']['price_usd'], но безрезультатно.

Я искал stackexchange для ответов на это, но люди только сказали мне, что я знаю до сих пор. Не как найти значение конкретной записи.

С уважением

+0

Быстрый ответ. С петлей. –

+0

Возможный дубликат [Как получить доступ к массиву/объекту?] (Http://stackoverflow.com/questions/30680938/how-can-i-access-an-array-object) – Sherif

+0

Не видите, как это дубликат. Этот вопрос задает информацию, о которой я уже говорил, не то, что я хочу: «Я пробовал $ data ['bitcoin'] ['price_usd'], но безрезультатно». –

ответ

0

Вы можете использовать функцию следующим образом:

function getPrice($data, $id) { 
    $price = 0; 

    foreach($data as $item) { 
     if($item->id == $id) { 
      $price = $item->price_usd; 
     } 
    } 

    return $price; 
} 

И тогда вы можете использовать его для пульсирующего случае, как это.

$dribblePrice = getPrice($data, 'ripple'); 

Надеюсь, это поможет.

+0

Предупреждение: Недействительный аргумент, предоставленный foreach() в /home/ubuntu/workspace/calculated.php –

1
$price = null; 
foreach ($data as $item) { 
    if ($item["id"] == "bitcoin") { 
     $price = $item["price_usd"]; 
     break; 
    } 
} 

var_dump($price); 
+0

@ Похоже на Weeabear, поскольку вы упомянули, что хотите использовать только нужные монеты из json. Таким образом, код выше не будет оптимальным, поэтому ему нужно каждый раз посещать json для новой монеты, упомянутой в массиве. –

0

Использовать настроенную функцию для создания ассоциативного массива,

function getAssociativeArray($result,$keyfield="") { 
      $dataarray = array(); 
      $i=0; 
      while($row = mysql_fetch_assoc($result)) { 
       if($keyfield!="") $dataarray[$row[$keyfield]] = $row; 
       else $dataarray[$i] = $row; 
       $i++; 
      } 
      return $dataarray; 
     } 

Пропустите $data массив и KEYFIELD в качестве идентификатора

$data = getAssociativeArray($data,'id'); 

, то вы можете получить доступ к результату, как $data['bitcoin']['price_usd'], не заботясь о ранге элемента.

0

Вот способ сделать это:

$data = json_decode('[ 
    { 
     "id": "bitcoin", 
     "name": "Bitcoin", 
     "symbol": "BTC", 
     "rank": "1", 
     "price_usd": "610.561", 
     "price_btc": "1.0", 
     "24h_volume_usd": "44104400.0", 
     "market_cap_usd": "9688885050.0", 
     "available_supply": "15868824.0", 
     "total_supply": "15868824.0", 
     "percent_change_1h": "0.12", 
     "percent_change_24h": "0.25", 
     "percent_change_7d": "-1.61", 
     "last_updated": "1473929966" 
    }, 
    { 
     "id": "ethereum", 
     "name": "Ethereum", 
     "symbol": "ETH", 
     "rank": "2", 
     "price_usd": "12.0793", 
     "price_btc": "0.0197864", 
     "24h_volume_usd": "8171040.0", 
     "market_cap_usd": "1014555388.0", 
     "available_supply": "83991240.0", 
     "total_supply": "83991240.0", 
     "percent_change_1h": "0.21", 
     "percent_change_24h": "1.25", 
     "percent_change_7d": "4.92", 
     "last_updated": "1473929962" 
    }, 
    { 
     "id": "ripple", 
     "name": "Ripple", 
     "symbol": "XRP", 
     "rank": "3", 
     "price_usd": "0.00597615", 
     "price_btc": "0.00000979", 
     "24h_volume_usd": "1017240.0", 
     "market_cap_usd": "211062429.0", 
     "available_supply": "35317458440.0", 
     "total_supply": "99997205581.0", 
     "percent_change_1h": "-0.16", 
     "percent_change_24h": "1.53", 
     "percent_change_7d": "0.88", 
     "last_updated": "1473929942" 
    }, 
    { 
     "id": "litecoin", 
     "name": "Litecoin", 
     "symbol": "LTC", 
     "rank": "4", 
     "price_usd": "3.83018", 
     "price_btc": "0.00627398", 
     "24h_volume_usd": "1101600.0", 
     "market_cap_usd": "182184060.0", 
     "available_supply": "47565404.0", 
     "total_supply": "47565404.0", 
     "percent_change_1h": "-0.11", 
     "percent_change_24h": "0.14", 
     "percent_change_7d": "-3.61", 
     "last_updated": "1473929943" 
    }, 
    { 
     "id": "monero", 
     "name": "Monero", 
     "symbol": "XMR", 
     "rank": "5", 
     "price_usd": "10.4646", 
     "price_btc": "0.0171415", 
     "24h_volume_usd": "4920040.0", 
     "market_cap_usd": "134987751.0", 
     "available_supply": "12899466.0", 
     "total_supply": "12899466.0", 
     "percent_change_1h": "-0.35", 
     "percent_change_24h": "-2.47", 
     "percent_change_7d": "-14.04", 
     "last_updated": "1473929949" 
    } 
]'); 

foreach ($data as $item) { 
    if($item->id === 'ripple'){ 
     echo $item->price_usd; 
     break; 
    } 
} 

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

Надеется, что это помогает

0
$json='[ 
       { 
        "id": "bitcoin", 
        "name": "Bitcoin", 
        "symbol": "BTC", 
        "rank": "1", 
        "price_usd": "610.561", 
        "price_btc": "1.0", 
        "24h_volume_usd": "44104400.0", 
        "market_cap_usd": "9688885050.0", 
        "available_supply": "15868824.0", 
        "total_supply": "15868824.0", 
        "percent_change_1h": "0.12", 
        "percent_change_24h": "0.25", 
        "percent_change_7d": "-1.61", 
        "last_updated": "1473929966" 
       }, 
       { 
        "id": "ethereum", 
        "name": "Ethereum", 
        "symbol": "ETH", 
        "rank": "2", 
        "price_usd": "12.0793", 
        "price_btc": "0.0197864", 
        "24h_volume_usd": "8171040.0", 
        "market_cap_usd": "1014555388.0", 
        "available_supply": "83991240.0", 
        "total_supply": "83991240.0", 
        "percent_change_1h": "0.21", 
        "percent_change_24h": "1.25", 
        "percent_change_7d": "4.92", 
        "last_updated": "1473929962" 
       }, 
       { 
        "id": "ripple", 
        "name": "Ripple", 
        "symbol": "XRP", 
        "rank": "3", 
        "price_usd": "0.00597615", 
        "price_btc": "0.00000979", 
        "24h_volume_usd": "1017240.0", 
        "market_cap_usd": "211062429.0", 
        "available_supply": "35317458440.0", 
        "total_supply": "99997205581.0", 
        "percent_change_1h": "-0.16", 
        "percent_change_24h": "1.53", 
        "percent_change_7d": "0.88", 
        "last_updated": "1473929942" 
       }, 
       { 
        "id": "litecoin", 
        "name": "Litecoin", 
        "symbol": "LTC", 
        "rank": "4", 
        "price_usd": "3.83018", 
        "price_btc": "0.00627398", 
        "24h_volume_usd": "1101600.0", 
        "market_cap_usd": "182184060.0", 
        "available_supply": "47565404.0", 
        "total_supply": "47565404.0", 
        "percent_change_1h": "-0.11", 
        "percent_change_24h": "0.14", 
        "percent_change_7d": "-3.61", 
        "last_updated": "1473929943" 
       }, 
       { 
        "id": "monero", 
        "name": "Monero", 
        "symbol": "XMR", 
        "rank": "5", 
        "price_usd": "10.4646", 
        "price_btc": "0.0171415", 
        "24h_volume_usd": "4920040.0", 
        "market_cap_usd": "134987751.0", 
        "available_supply": "12899466.0", 
        "total_supply": "12899466.0", 
        "percent_change_1h": "-0.35", 
        "percent_change_24h": "-2.47", 
        "percent_change_7d": "-14.04", 
        "last_updated": "1473929949" 
       } 
      ]'; 
      $var=json_decode($json); 
      foreach ($var as $value) { 
       if($value->id=='ripple') 
       { 
       echo $value->price_usd; 
       } 
      } 
1

Предположит, что у вас есть список необходимых монет, указанных в массиве, который является любой последовательностью последовательности JSon. Затем вместо проверки всех json-данных за каждый раз. Я проверил, что если какой-либо id из массива соответствует json id, тогда выберите price_usd. Это будет иметь оптимальные результаты, просто пройдя json один раз.

<?php 
$data = file_get_contents('https://api.coinmarketcap.com/v1/ticker/'); 
$data = json_decode($data, true); 
$need = array(
    'nexus', 
    'bitcoin', 
    'zombiecoin', 
    'ambercoin' 
); 
foreach ($data as $key => $value) { 
    if (in_array($data[$key]['id'], $need)) { 
     echo $data[$key]['id'] . " = " . $data[$key]['price_usd']; 
     echo "<br>"; 
    } 
} 
?> 

Результаты -

bitcoin = 610.398 
nexus = 0.0356638 
ambercoin = 0.0104771 
zombiecoin = 0.000121343 
+0

Это работает, но я хочу иметь возможность определять и сохранять значение определенной монеты в качестве переменной. –

+0

позволяет сказать, что вы определили определенные монеты в массиве. поэтому вы хотите получить их значения от json.? –

+0

Да. Предположим, мне нужны значения для биткойнов, эфироидов и пульсаций. Как я это сделаю? –

0

Вы можете использовать комбинацию array_search и array_column, чтобы получить результат.

Примечание:array_column только из PHP 5.5 года.

$data = json_decode($json_string, true); 
// finding the key of ripple 
$key = array_search('ripple', array_column($data, 'id')); 
echo $result[$key]['price_usd']; 

Полный код: (Обработанный строка JSON)

<?php 

$str = '[ 
    { 
     "id": "bitcoin", 
     "name": "Bitcoin", 
     "symbol": "BTC", 
     "rank": "1", 
     "price_usd": "610.471", 
     "price_btc": "1.0", 
     "24h_volume_usd": "44349800.0", 
     "market_cap_usd": "9687471507.0", 
     "available_supply": "15868848.0", 
     "total_supply": "15868848.0", 
     "percent_change_1h": "0.02", 
     "percent_change_24h": "0.19", 
     "percent_change_7d": "-1.74", 
     "last_updated": "1473931166" 
    }, 
    { 
     "id": "ethereum", 
     "name": "Ethereum", 
     "symbol": "ETH", 
     "rank": "2", 
     "price_usd": "12.0771", 
     "price_btc": "0.0197825", 
     "24h_volume_usd": "8286810.0", 
     "market_cap_usd": "1014377525.0", 
     "available_supply": "83991813.0", 
     "total_supply": "83991813.0", 
     "percent_change_1h": "-0.02", 
     "percent_change_24h": "1.19", 
     "percent_change_7d": "5.02", 
     "last_updated": "1473931161" 
    }, 
    { 
     "id": "ripple", 
     "name": "Ripple", 
     "symbol": "XRP", 
     "rank": "3", 
     "price_usd": "0.0059753", 
     "price_btc": "0.00000979", 
     "24h_volume_usd": "1018920.0", 
     "market_cap_usd": "211032409.0", 
     "available_supply": "35317458440.0", 
     "total_supply": "99997205581.0", 
     "percent_change_1h": "-0.26", 
     "percent_change_24h": "1.51", 
     "percent_change_7d": "0.86", 
     "last_updated": "1473931142" 
    } 
]'; 

$result = json_decode($str, true); 

$key = array_search('ripple', array_column($result, 'id')); 
echo $result[$key]['price_usd']; 
?> 

Выход:

0.0059753 
+0

процесс $ data [3] ['price_usd'] тот же, что и ваш ответ, тогда зачем использовать этот длинный код? –

+0

Потому что это использует систему ранжирования. Порядок внесения изменений изменяется. Я пробовал этот код, но он дал мне пустую страницу. Я использую PHP 5.5.9-1. –

+0

@WhytetheWeeabear обновил рабочее решение. '$ key' будет ключевым (ранжированием) для рябь в массиве. – Jigar

0

Поскольку ваши данные JSON массив из массивов, вы можете проверить сначала, если вы суб-массив имеет идентификатор «рябь», а затем получает «price_usd» следующим образом:

function get_usd_price($data) { 
    $price_usd = 0.00; 

    foreach($data as $row) { 
     $id = $row['id']; 

     if($id == 'ripple' && array_key_exists('price_usd', $row)) { 
      $price_usd = $row['price_usd']; 
     } 
    } 

    return $price_usd; 
} 

$data  = json_decode($myJSONarray); 
$price_usd = get_usd_price('ripple', $data); // returns 0.00597615 in your example 
Смежные вопросы