在PHP中将大对象数组声明为javascript参数

时间:2016-08-12 13:58:10

标签: javascript php arrays object

我需要将PHP数组传递给javascript函数,其中数组的格式为

var Waypoints = [{"Geometry":{"Latitude":52.34,"Longitude":55.35}},{"Geometry":{"Latitude":55.34,"Longitude":56.35}}]

以下是代码段:

class Geometry
{
  public $Latitude;
  public $Longitude;
}
class WayPoint
{
  public $Geometry;
}
$Geometry = new Geometry();

$wp = new WayPoint();
$wp->Geometry->Latitude = 52.34;
$wp->Geometry->Longitude = 55.35;

$wp2 = new WayPoint();
$wp2->Geometry->Latitude = 55.34;
$wp2->Geometry->Longitude = 56.35;

$php_data = [$wp,$wp2 ];
echo json_encode($php_data);

产生这个:

[{"Geometry":{"Latitude":52.34,"Longitude":55.35}},{"Geometry":{"Latitude":55.34,"Longitude":56.35}}]

这是正确的数组结构,但我提出两个问题:

  1. 这是声明对象类的最佳方式,关于用大量坐标填充数组,
  2. 为什么PHP会对第13行和第16行的代码发出关于空值的警告,即
  3.   

    警告:从for中为空值创建默认对象   $ wp->几何 - >纬度= 52.34;和$ wp2->几何 - >纬度= 55.34;

    从我从文档中可以看出,这是声明一个对象的正确方法,为什么它只是被标记的第一个变量?

2 个答案:

答案 0 :(得分:0)

错误是因为您没有分配Geometry个对象的Waypoint属性。

它仍然有效,因为当您将属性分配给不存在的变量时,php将创建一个默认对象(称为stdClass)。

有一个更简单的解决方案 - json_encode将一个asociative数组作为输入:

echo json_encode(
    [
        [
            'Geometry'=>
                [
                    'Latitude'  =>  52.34,
                    'Longtitude'=>  55.35,
                ]
        ],
        [
            'Geometry'=>
                [
                    'Latitude'  =>  52.65,
                    'Longtitude'=>  56.35,
                ]
        ],
    ]
);

显然你可以在循环中构建这个数组。

如果您确实想要使用命名类,出于其他原因,那么正确的代码将是:

class Geometry
{
  public $Latitude;
  public $Longitude;
}
class WayPoint
{
  public $Geometry;
}

$data=[];


$wp = new WayPoint();
$gm = new Geometry();
$gm->Latitude = 52.34;
$gm->Longitude = 55.35;

$wp->Geometry = $gm;

$data[]=$wp;


echo json_encode($data);

答案 1 :(得分:0)

接受史蒂夫的评论和Barmar的评论(关于构造函数的使用),我能够简化实现并简化整理。我希望这可以帮助那些想要做同样事情的人。

class Geometry
{
   public $Latitude;
   public $Longitude;
}
class WayPoint
{
   public function __construct($Lat, $Long)
   {
       $geometry = new Geometry();
       $geometry->Latitude = $Lat;
       $geometry->Longitude = $Long;
       $this->Geometry = $geometry;
   }
}

$wp = new WayPoint(52.34,68.89);
$wp2 = new WayPoint(55.45,67.89);

$php_data = [$wp,$wp2 ];
echo json_encode($php_data);