如何在计算过程中维护数组结构和键

时间:2013-05-18 15:16:28

标签: php arrays multiplication

我有一个包含数据行的数据库,其中每列都是一个国家/地区。在这个例子中有4个国家(列)和3行,虽然每个国家的数量都会改变,因此需要是动态输入。我想规范化每一行,使最小值为0,最大值为100,同时保留原始数据库的4 x 3数组结构,以便我可以根据请求提取行或列。

最终输出将传递给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);
?>

echo json_encode($ dataA)的输出是

[{"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"}]

echo json_encode($ ScoreNorm)的输出为

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

重申一点,我希望$ScoreNorm维持$dataA format。任何想法都非常感激。

4 个答案:

答案 0 :(得分: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;

}

当前需要创建一个新数组然后在最后添加到数组数组时,您正在以一维方式填充数组。

答案 1 :(得分:0)

不是创建$ ScoreNorm,而是将行添加到正常的$ dataA,然后修改它并将其添加到$ 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;
}

答案 2 :(得分: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

答案 3 :(得分:0)

  

我想知道是否有人知道如何为$ ScoreNorm保持与$ dataA的输出相同的结构

您只需要维护规范化数组中的键即可实现。

$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;
}

我建议对标准化值进行舍入,因为它会重新编写JSON响应的长度,并且该分数确实不包含相关信息。所以我会更改行

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

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