2012-02-09 4 views
2

학교에서 수업을위한 "주식"웹 사이트를 만들려고하고 있으며, PHP에 대한 첫 번째 다이빙입니다. 기본적으로 스크립트는 CSV 파일을 Google 워드 프로세서 스프레드 시트 형식으로 가져오고 나중에 값을 배열에 넣으려고 시도합니다. 나는 5 대 상승 및 하락 주식을 보여주고 싶지만 문제가 있습니다. 스크립트의 주요 섹션은 다음과 같습니다.PHP에서 중첩 키 - 값 조회

<html> 
<head> 
    <?php 
    #Global Variables 
    $rising = array(); 
    $falling = array(); 
    $stocks = array(); 
    #End Global Variables 

    #Function to read data from the spreadsheet 
    function get_data($url){ 
     $ch = curl_init(); 
     $timeout = 5; 
     curl_setopt($ch,CURLOPT_URL,$url); 
     curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
     curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout); 
     $data = curl_exec($ch); 
     curl_close($ch); 
     return $data; 
    } 

    #Process data 
    function populateTicker(){ 
     $document = "https://docs.google.com/spreadsheet/pub?hl=en_US&hl=en_US&key=0AtrtT_MC9_YFdHRDUGx0a2xveXNfOHJVdXJ6bVNkMFE&output=csv"; 
     $data= get_data($document); 
     $lines = explode("\n", $data); 
     $val = ""; 
     foreach($lines as $key => $value){ 
      if($key != 0){ 
       $stockInfo = explode(",", $value); 
       $perChange = $stockInfo[3]; 
       $perChangeVal = "up "; 
       if($perChange < 0){ 
        $perChangeVal = "down "; 
        $falling['$stockInfo[0]'] = $perChange; 
       }else{ 
        $rising['$stockInfo[0]'] = $perChange; 
       } 
       $stocks['$stockInfo[0]'] = array("symb" => $stockInfo[0], "name" => $stockInfo[1], "price" => $stockInfo[2]); 
       $val = $val . "(" . $stockInfo [0] . ") " . $stockInfo [1] . " " . "\$" . $stockInfo [2] . " " . $perChangeVal . $perChange . "% today" . "\v \v \v \v | \v \v \v \v"; 
      } 
     } 
     //asort($falling); 
     //arsort($rising); 
     return $val; 
    } 

    function getRising($index){ 
     if($index <= count($rising)){ 
      $keys = array_keys($rising); 
      $data = $stocks[$keys[$index]]; 
      return "(" . $data['symb'] . ") " . $data['name'] . " " . "\$" . $data['price']; 
     }else{ 
      return "."; 
     } 

    } 

    function getFalling($index){ 
     if($index <= count($falling)){ 
      $keys = array_keys($falling); 
      $data = $stocks[$keys[$index]]; 
      return "(" . $data['symb'] . ") " . $data['name'] . " " . "\$" . $data['price']; 
     }else{ 
      return "."; 
     } 
    } 
    ?> 
</head> 
<body> 
    <DIV id='DEBUG'> 
     <?php 
      print_r($stocks); 
      print_r($rising); 
      print_r($falling); 
     ?> 
    </DIV> 
    <center><b><u><font size="+2">Latest Prices</font><br /></u></b></center> 
    <DIV ID="TICKER" STYLE="border-top:2px solid #CCCCCC; border-bottom:2px solid #CCCCCC; overflow:hidden; width:100%" onmouseover="TICKER_PAUSED=true" onmouseout="TICKER_PAUSED=false"> 
    <?php echo populateTicker(); ?> 
    </DIV> 
    <script type="text/javascript" src="webticker_lib.js" language="javascript"></script> 
    <div id='Top5'> 
    <br /> 
    <center><b>This page does not update automatically! Please refresh the page to update the information!</b></center> 
    <br /> 
    <center><b><u><font size="+2">Top 5's</font><br /></u></b></center> 
    <center> 
     <table border="1" cellpadding="5"> 
      <tr> 
      <th>Top 5 Rising</th> 
      <th>Top 5 Falling</th> 
      </tr> 
      <tr> 
      <td><?php echo getRising(1); ?></td> 
      <td><?php echo getFalling(1); ?></td> 
      </tr> 
      <tr> 
      <td><?php echo getRising(2); ?></td> 
      <td><?php echo getFalling(2); ?></td> 
      </tr>  <tr> 
      <td><?php echo getRising(3); ?></td> 
      <td><?php echo getFalling(3); ?></td> 
      </tr>  <tr> 
      <td><?php echo getRising(4); ?></td> 
      <td><?php echo getFalling(4); ?></td> 
      </tr>  <tr> 
      <td><?php echo getRising(5); ?></td> 
      <td><?php echo getFalling(5); ?></td> 
      </tr> 
     </table> 
    </center> 
    </div> 
    <br /> 
    <center><b><u><font size="+2">All Stocks</font><br /></u></b></center> 
    <div id='All'> 
    <center> 
     <table border="1" cellpadding="5"> 
      <tr> 
      <th>Symbol</th> 
      <th>Name</th> 
      <th>Price</th> 
      <th>High</th> 
      <th>Low</th> 
      <th>Percent Change</th> 
      </tr> 
      <?php 
      #Dynamic Table Creation 
      foreach($stocks as $key => $value){ 
       echo '<tr>'; 
        echo '<td>(' . $value['symb'] . ')</td>'; 
        echo '<td>' . $value['name'] . '</td>'; 
        echo '<td>' . $value['price'] . '</td>'; 
        echo '<td></td>'; 
        echo '<td></td>'; 
        echo '<td>' . $vaule['perChange'] . '</td>'; 
       echo '</tr>'; 
      } 
      ?> 
     </table> 
    </center> 
    </div> 
</body> 
<footer> 
</footer> 
</html> 

하지만 아무것도 배열에 할당되지 않습니다. 어떤 도움을 주시면 감사하겠습니다.

업데이트 : 앞 페이지의 전체 소스 인 index.php를 추가했습니다. UPDATE2 : 알아 냈습니다. 나는 자바에서 왔고, 변수의 범위가 PHP에서 어떻게 작동하는지 완전히 이해하지 못했다. 간단한

<?php 
global $rising, $falling, $stocks; 
... 
?> 

+0

아무 데서도 전화를 걸지 않는 것 같습니다. btw 이것이 "숙제"인 경우 사람들이 알 수 있도록 태그를 지정해야합니다. – liquorvicar

+0

숙제가 아니며 그 기능은 다른 곳에서 호출됩니다. 혼란스러워서 죄송합니다! populateTicker() 함수가 예상 한 데이터를 반환하므로 실행 중임을 알 수 있습니다. 내가 문제가있는 것은 $ rising과 $ falling에 대한 배열 할당이 배열이 공백으로 남아 있기 때문에 아무 것도하지 않는 것입니다. – nlowe

+0

SO BTT에 오신 것을 환영합니다. 당신이 그것을 알아 냈기 때문에 기뻤습니다. 나는 그걸 제안하려고했습니다! 스텝 디버거를 작동시키는 데 약간의 시간을 투자 할 것을 권한다. 단, 단위 테스트를 원할 수도있다. 나는 당신이 자바에서 오는 이런 것들에 대한 경험이 있다고 가정하고있다. 또한 코드에 버그가 있습니다 : $ rising [ '$ stockinfo [0]']은 $ rising [$ stockInfo [0]]이어야합니다. 그렇지 않으면 $ stockInfo [0]을 문자열 리터럴로 처리합니다. – liquorvicar

답변

1

내가 코드에 대해 정확히 모르지만이 중첩 배열 제시에 대한 예를 표시 할 수 있습니다 속임수를 썼는지 :

$arr = array('1' => array('1', '2'), '2'); 

function showNested($array) 
{ 
    foreach($array as $key => $value) 
    { 
    if(is_array($value)) 
    { 
     echo $value; 
     showNested($array); 
    } 
    else 
    { 
     echo $value; 
    } 
    } 
} 

UPDATE를

코드에 $stocks['$stockInfo[0]']을 (를) 사용했습니다. 나는 이런 종류의 문법이 결코 아무것도하지 않을 것이라고 생각한다. 문자열에서 변수를 사용할 때는 {}으로 묶어야합니다. 그리고 전에 한번도 테스트 해 본 적이없는 다른 하나는 인덱스에 배열을 넣어 문자열에 넣는 것이 PHP가 []에있는 현재 데이터를 이해하는 데 도움이 될 것이라고 생각하지 않습니다.

+0

죄송합니다. 매우 명확하지 않아야합니다 (처음 게시하는 경우). 내 문제는 배열을 읽는 방법이 아니라 어떻게 저장합니까? array_push와 직선 할당 모두 아무 것도하지 않는 것 같아서 ... – nlowe

+0

나는 이해할 수 없다. 가게에서 무엇을 의미합니까? 각 필드를 읽고 다른 배열에 저장 하시겠습니까? 만약 그렇다면'$ arr [] = $ data'을 사용하십시오. 'array_push'를 사용하면 배열에 대한 조작을하기 때문에 구식 방식을 사용하는 것이 더 낫다고 생각합니다. 사용 후에는 배열을 재설정해야합니다. 나는 그것을 어딘가에 읽었다. – MahanGM