2013-06-12 13 views
0

我正在使用一個API,並使用一些foreach循環來到現在我所處的階段。請參閱下面的代碼和我的評論,以及我得到的結果。PHP循環來獲得我需要的數據

// get recent_games api data 
$recent_games_data = $player->recent_games(); 

//start arrays for below 
$matches = array(); 
$gameType = array(); 
$myData = array(); 

// using foreach loops to dig in to api data 
foreach($recent_games_data['gameStatistics']['array'] as $key_match_data => $value_match_data) { 
    $matches[] = $value_match_data['statistics']; 
} 
foreach($matches as $key_match) { 
    $gameType[] = $key_match['array']; 
} 
foreach ($gameType as $keyz) { 
    $myData[] = $keyz; 
} 

$ mydata數組輸出以下數據。

Array 
(
[0] => Array 
    (
     [0] => Array 
      (
       [statType] => TRUE_DAMAGE_DEALT_TO_CHARACTER 
       [dataVersion] => 0 
       [value] => 3351 
       [futureData] => 
      ) 

     [1] => Array 
      (
       [statType] => ASSISTS 
       [dataVersion] => 0 
       [value] => 14 
       [futureData] => 
      ) 

     [2] => Array 
      (
       [statType] => NUM_DEATHS 
       [dataVersion] => 0 
       [value] => 3 
       [futureData] => 
      ) 
    ) 
[1] => Array 
    (
     [0] => Array 
      (
       [statType] => TRUE_DAMAGE_DEALT_TO_CHARACTER 
       [dataVersion] => 0 
       [value] => 331 
       [futureData] => 
      ) 

     [1] => Array 
      (
       [statType] => ASSISTS 
       [dataVersion] => 0 
       [value] => 4 
       [futureData] => 
      ) 

     [2] => Array 
      (
       [statType] => NUM_DEATHS 
       [dataVersion] => 0 
       [value] => 7 
       [futureData] => 
      ) 
    ) 

當然有更多的數據,但這基本上是我現在擁有的。第一個數組[0]爲,每個匹配爲,第二個數組爲,統計數據爲。我想要的是如何獲得每場比賽的統計數據,而不用硬編碼比賽陣列號碼,例如下面。

$myData[0][0]['statType'] 

讓我知道你是否需要更多的信息,謝謝。

編輯:對不起,提及作爲新的統計數據被添加到API,索引號碼的變化。 IE TRUE_DAMAGE_DEALT_TO_CHARACTER是[0]開始與但隨後可改變爲[1]或[2]等

+0

你應該考慮在與代替模型類工作構建一個巨大的關聯數組。起初可能會做更多的工作,但它會使編碼和維護變得更容易。這就是OOP發明的原因! – Pevara

回答

0

你不需要幾個foreach循環 - 你可以添加到一個單一的所有三個數組。此外,它看起來像$ gameType和$ myData結束了包含相同的數據。

foreach($recent_games_data['gameStatistics']['array'] as $key_match_data => $value_match_data) { 
    $matches[] = $value_match_data['statistics']; 
    $gameType[] = $value_match_data['statistics']['array']; 
    $myData[] = $value_match_data['statistics']['array']; 
} 

我真的不明白,爲什麼你不只是把它放到同一個數組,所以你可以方便地訪問,雖然:

foreach($recent_games_data['gameStatistics']['array'] as $key_match_data => $value_match_data) { 
    $matches[] = array('statistics' => $value_match_data['statistics'], 'data' => $value_match_data['statistics']['array']); 
} 
+0

啊,我看到了,這確實有很大的意義 - 我想我有點沮喪,並開始做不好的代碼,只是爲了讓它現在工作,然後打算在以後清理。我在上面添加了一條評論,將粘貼在這裏供您查看。 遺憾的是,隨着新的統計數據被添加到API中,索引號發生了變化。 IE TRUE_DAMAGE_DEALT_TO_CHARACTER是以[0]開頭,但可能會變成[1]或[2]等。 – CarlTaylor1989

+0

在這種情況下,您可能需要重寫從API接收的數據,以便不使用[[0] => Array([statType] => ASSISTS)'等等,你可以使用'$ someArray ['assists'] = array('dataversion'=> $ someVal,'value'=> $ someVal/* etc * /);' 。這樣,你可以很容易地更新'$ matches [5] ['assists'] = array(/ * new values * /);'或類似的。 –

+0

由於我剛剛取得了突破,這對我們幫助很大,感謝! – CarlTaylor1989

1

考慮通過數據解析(獨立的單個匹配的信息的鍵)後執行的一類爲您的統計項目:

class Stat_Item { 
    function __construct($id, $info) { 
     $this->id = $id; 

     if(!empty($info['damage']) 
      $this->damage_dealt = $info['damage']; 

     if(!empty($info['assists'])) 
      $this->assists = $info['assists']; 

     if(!empty($info['deaths'])) 
      $this->deaths = $info['deaths']; 
    } 
} 

$parsed_items = array(); 

foreach($mydata as $match_id => $match) { 
    $info = array(); 

    foreach($match as $data_point) { 
     switch($data_point['statType']) { 
      case TRUE_DAMAGE_DEALT_TO_CHARACTER: 
       $info['damage'] = $data_point['value']; 

       break; 

      case ASSISTS: 
       $info['assists'] = $data_point['value']; 

       break; 

      case NUM_DEATHS: 
       $info['deaths'] = $data_point['value']; 

       break; 
     } 

     $parsed_items[] = new Stat_Item($match, $info); 
    } 
} 

除了通過他們所有的循環,我看不出有什麼方法可以讓你得到一個特定的比賽,而不由其index調用它。

+0

我已經在此添加了更多信息,這會使上述無效 - 謝謝! – CarlTaylor1989

+0

用另一個可能的解決方案更新了我的答案。 – jterry

+0

這看起來不錯 - 我一定會考慮這個。感謝您的幫助 – CarlTaylor1989