我需要将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}}]
这是正确的数组结构,但我提出两个问题:
警告:从for中为空值创建默认对象 $ wp->几何 - >纬度= 52.34;和$ wp2->几何 - >纬度= 55.34;
从我从文档中可以看出,这是声明一个对象的正确方法,为什么它只是被标记的第一个变量?
答案 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);