2013-05-18 30 views
0

我有其中每列是一個國家數據的行的數據庫中陣列結構和鍵。在這個例子中,有4個國家(列)和3個行,儘管每個國家的數量都會發生變化,所以需要動態的輸入。我想標準化每一行,因此最小值爲0,最大值爲100,同時保留原始數據庫的4 x 3數組結構,以便根據請求提取行或列。如何保持calcultations

最終輸出將被傳遞到Javascript來以圖形的形式來呈現。 我已經想出了正確的數據正常化的代碼,但輸出是一個長陣列12 x 1和列名已被刪除。

我想知道是否有人知道我如何保持$ScoreNorm的結構與$dataA的輸出相同?

<?php 
$conn=mysql_connect("relevant inputs"); 

if(! $conn) 
{ 
    die('Could not connect: ' . mysql_error()); 
} 
    mysql_select_db("db-name"); 

    $dataArray = "SELECT * FROM data2012" 
     or die(mysql_error()); 

$data2012=mysql_query($dataArray, $conn); 
if(! $data2012) 
{ 
die('Could not get data: ' . mysql_error()); 
} 

$ScoreNorm = array(); 
$dataA = array(); 

while($row = mysql_fetch_assoc($data2012)) 
{ 
$dataA[] = $row; 
$max_val = max($row); 
$min_val = min($row); 

    foreach($row as $key => &$dataAitem) 
     { 
    $ScoreNorm[] = array((($dataAitem - $min_val)/($max_val - $min_val))*100); 
     } 
} 
echo json_encode($dataA) . "<br />"; 
echo json_encode($ScoreNorm) . "<br />"; 

echo $dataA[1]['France']; 
mysql_close($conn); 
?> 

的輸出回波json_encode($數據A)是

[{"China":"11.000","Australia":"8.300","France":"12.600","UK":"6.220"},{"China":"2.000","Australia":"1.000","France":"4.000","UK":"5.000"},{"China":"39548.000","Australia":"25487.000","France":"245.000","UK":"2547852.000"}] 

凡作爲輸出回波json_encode($ ScoreNorm)是

[[74.921630094],[32.6018808777],[100],[0],[25],[0],[75],[100],[1.54274187502],[0.990812162158],[0],[100]] 

要重申,我想$ScoreNorm保持$dataA format。任何想法不勝感激。

+0

[**在新的代碼,請不要使用'mysql_ *'功能**](http://bit.ly/phpmsql )。他們不再被維護[並且被正式棄用](http://j.mp/XqV7Lp)。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http://j.mp/QEx8IB)將幫助你決定哪個。如果你選擇PDO,[這裏是一個很好的教程](http://j.mp/PoWehJ)。 –

回答

0

我已經破解了第二的foreach伸到自己的循環,因爲我不知道你使用的列名,這和我平時也都取了這一點。我也在假設國名是關鍵,而數字是價值。如果你需要的是幫助,只是讓我知道什麼是列名在你的結構,否則檢查了這一點:

$dataA = array(); 
$ScoreNorm = array(); 
while($row = mysql_fetch_assoc($data2012)) 
{ 

    $dataA[] = $row; 

} 


foreach($dataA as $dataAkey => $dataAvar){ 

$max_val = max($dataAvar); 
$min_val = min($dataAvar); 

$ScoreNormTemp=array(); 

    foreach($row as $country => $value) 
    { 

     $ScoreNormTemp[$country] = 
      array((($value - $min_val)/($max_val - $min_val))*100); 

    } 

$ScoreNorm[] = $ScoreNormTemp; 

} 

您當前填充數組中的一個尺寸,當你需要一個新的陣列然後在最後添加到數組數組中。

0

而不是創建$ ScoreNorm,該行添加到$數據A爲正常,然後修改它,並把它添加到$ ScoreNorm的:

while($row = mysql_fetch_assoc($data2012)) 
{ 
    $dataA[] = $row; 
    $max_val = max($row); 
    $min_val = min($row); 

    foreach($row as &$dataAitem) { 
     $dataAitem = (($dataAitem - $min_val)/($max_val - $min_val))*100; 
    } 
    $ScoreNorm[] = $row; 
} 
0

林不知道我理解正確,什麼妳後,但我會嘗試沒有少

$output_arr = new array(); //final output 
while($row = mysql_fetch_assoc($data2012)) 
{ 
$dataA[] = $row; 
$max_val = max($row); 
$min_val = min($row); 

$row_arr = new array(); 
    foreach($row as $key => &$dataAitem) // this create temp array keeping the property name 
     { 
      $row_arr[$key] = normalized_value ($dataitem); //put your func here.. to get this value for this country 
     } 

array_push ($output_arr,$row_arr); //now add this to final output array.. 
} 

echo json_encode ($output_arr); //should have what u seek, i hope 
0

我想知道是否有人知道我怎麼能保持相同的結構$ ScoreNorm作爲爲$數據A

輸出

你只需要維護標準化數組中的鍵來實現這一點。

$ScoreNorm = array(); 
$dataA  = array(); 

while ($row = mysql_fetch_assoc($data2012)) { 
    $dataA[] = $row; 
    $max_val = max($row); 
    $min_val = min($row); 

    $rowNorm = array();  
    foreach ($row as $key => $dataAitem) { 
     $rowNorm[$key] = ($dataAitem - $min_val)/($max_val - $min_val)*100; 
    } 
    $ScoreNorm[] = $rowNorm; 
} 

我建議你圓的標準值,因爲它redices JSON響應的長度和比例不確實包含相關信息。所以,我線

 $rowNorm[$key] = ($dataAitem - $min_val)/($max_val - $min_val)*100; 

改變

 $rowNorm[$key] = (int)round(($dataAitem - $min_val)/($max_val - $min_val)*100);