【问题标题】:How to maintain array structure and keys during calcultations如何在计算过程中维护数组结构和键
【发布时间】:2013-05-13 14:39:43
【问题描述】:

我有一个数据库,其中每列是一个国家/地区。在此示例中,有 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。任何想法都非常感谢。

【问题讨论】:

标签: php arrays multiplication


【解决方案1】:

我已经将第二个 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;

}

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

【讨论】:

    【解决方案2】:

    不是创建 $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;
    }
    

    【讨论】:

      【解决方案3】:

      我不确定我是否正确理解你所追求的,但我会尽量尝试

      $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
      

      【讨论】:

        【解决方案4】:

        我想知道是否有人知道我如何为 $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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-22
          • 1970-01-01
          • 2011-08-13
          • 1970-01-01
          • 2020-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多