0

我有一个数据库,其中每列是一个国家/地区。在此示例中,有 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

4 回答 4

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
于 2013-05-18T15:39:04.820 回答
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;

}

您当前正在一维地填充数组,当您需要创建一个新数组时,然后将其添加到最后的数组数组中。

于 2013-05-18T15:32:10.713 回答
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;
}
于 2013-05-18T15:35:48.627 回答
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);
于 2013-05-19T16:38:37.213 回答