麻烦将2d php数组转换为2d javascript数组

时间:2014-03-08 21:07:21

标签: javascript php json

我确实做了我认为的非代码审查传递黑客将一个二维数组从PHP传递给Javascript。外部数组包含元素,每个元素都是一个数组。

每个内部数组由我的数据库记录中的4个字段组成。内部数组元素是:城镇的名称,纬度和经度,以及整数索引。

代码是否有效?是。但我很讨厌这样一个事实:我99%确信,作为一个相当原始的初学者,有一个更好的方法来创建然后从PHP传递一个2d数组到Javascript我需要知道如何,因为我一起黑客攻击通过反复试验和阅读大量的SO帖子,并没有从先验的技术诀窍,智慧或信心中创造出来。

每个外部数组元素都是(需要)看起来像这样的数组:

热门 阵列

[0] = [“Campbell”,37.21,122.0,0]

[1] = [“Sunnyvale”,37.54,121.37,1]

[2] = [“Saratoga”,37.24,122.001,2]

[3] = ......等。等...........

请注意,第二级数组有一个字符串,然后是一个浮点数,然后是另一个浮点数,然后是一个整数。

这是PHP中的代码,它将我的数据库记录打包成一个二维PHP数组(错误检查,为清晰起见,未显示其他代码):

 $result = mysql_query($query);
 $numrows = mysql_num_rows($result);

 $outerArray = array();

 for($i = 0; $i < $numrows;  $i++)
 {
   $theRow = mysql_fetch_row($result);

   $city = $theRow[1];
   $lat = $theRow[22];
   $lng = $theRow[23];

   $outerArray[] = array($city, $lat, $lng, $i);
 }
 $latLngValues = json_encode($outerArray);

 // EDIT: ADDED TO TELL ME WHAT THIS 2d ARRAY ACTUALLY LOOKS LIKE
 var_dump($latLngValues);

在我的网页的 onload 处理程序中,我调用了一个javascript函数并传递了这个数组:

 <body onload='handleLoad(<?php echo $latLngValues ?>)'>

这是我的handleLoad():

 function handleLoad( latLng2dArray )
 {

   for (var i = 0; i < latLng2dArray.length; i++) 
   {

     var town = latLng2dArray[i];

     var latitude = Number(town[1]);
     var longitude = Number(town[2]);

     // I USE THE DATABASE RECORD'S NUMBERS TO CREATE A Gmaps LatLng
     var myLatLng = new google.maps.LatLng(latitude, longitude);

   }

这可能是一种更清洁,更高效的方法。

例如,我发现如果我没有使用 Number()功能将我的数据库号码“强制”为一个数字,则调用“ new google.maps.LatLng (纬度,经度)“给了我 NaN

所以我希望更有经验的人能让我知道更清洁的方式。虽然这段代码有效,但我通过反复试验将其攻击了一天。

编辑:我在我的php代码中使用了一个var_dump()来查看2d数组“$ latLngValues”在传递给我的onload处理程序之前的样子,“$ latLngValues”看起来像这样:

  string(133) "[["Campbell","37.2724","-122",0],["Sunnyvale","37.2724","-122",1],["LosGatos","37.2607","-122",2],["Saratoga","37.2607","-122.046",3]]" 

我想指出这一点:在我的数据库中,我使用的数据类型是纬度和经度的“浮动”。不确定var_dump如何/为什么将它们显示为字符串(不是浮点数),而整数索引被正确处理,而不是字符串。

1 个答案:

答案 0 :(得分:0)

没有人提供更好的编码策略,所以现在,我将使用上面的现有代码 - 它不是很好但是有效。如果找到更正确的方法,我会回发。