【问题标题】:PHP array to JSON having a parameter with a callback functionPHP数组到JSON具有带有回调函数的参数
【发布时间】:2019-04-26 18:19:34
【问题描述】:

在我的 PHP 脚本中,我有一个类似这样的数组:

$panorama = array(
    "default" => array(
        "firstScene" => 2,
        "author" => 'Felipe'
    ), 
    "scenes" => array(
        "circle" => array(
            "title" => "Title 1", 
            "hotSpots" => array(
                "pitch" => "-2.1",
                "createTooltipFunc" => "hotspot"
            )
        )
    )
);

这个数组将被传递给一个 Javascript 函数,作为一个 json 对象,像这样:

pannellum.viewer('panorama', <?php echo json_encode($panorama); ?>);

参数createTooltipFunc 必须接收一个名为hotspot 的回调函数。所以,在最终的 json 中,当我将这个 PHP 数组传递给 Javascript 函数时,这个参数应该是这样的:"createTooltipFunc" :hotspot,不带双引号。我该怎么做?

只是为了提供更多信息,我正在尝试使用插件 pannellum.js 创建一个游览,并且我正在从我的 mysql DB 中获取我需要的所有 json 信息。 p>

【问题讨论】:

    标签: javascript php json pannellum


    【解决方案1】:

    在两者之间保留一个 Javascript 变量,在它与 pannellum 一起使用之前保留对象并更新属性(假设 hotspot 是一个变量)。

    //  create Javascript object
    var obj = <?php echo json_encode($panorama); ?>;
    
    // update createTooltipFunc proeprty with the variable
    // where variable name can be extract from $panorama
    obj.scenes.circle.hotSpots.createTooltipFunc = <?php echo $panorama['scenes']['circle']['hotSpots']['createTooltipFunc']; ?>;
    
    pannellum.viewer('panorama', obj);
    

    【讨论】:

    • 未捕获的引用错误:未定义热点
    • 那行不通。我多次出现 createTooltipFunc。这是一个比我给出的示例具有更多级别的数组。我必须给这个参数一个javascript函数才能自定义我的热点。
    • @PranavCBalan 您可以使用 obj.scenes.circle.hotSpots.createTooltipFunc 访问它
    • 所以,我必须使用 Javascript 搜索和替换双引号?
    • @churros : 这是一种方法
    【解决方案2】:

    按照 Pranav 的建议,我必须将 PHP 数组放入一个 javascript 对象并循环遍历它以找到正确的节点,然后将旧值替换为新值,如下所示:

    var objTour = <?php echo json_encode($panorama); ?>;
                for (var [key, value] of Object.entries(objTour.scenes)) {
                    var objdadosScene = value;
                    for (var [key, value] of Object.entries(objdadosScene)) {
                        if(key == 'hotSpots'){
                            var objHotspot = objdadosScene.hotSpots;
                            for (var [key, value] of Object.entries(objHotspot)) {
                                var objDadosHotspot = value;
                                for (var [key, value] of Object.entries(objDadosHotspot)) {                             
                                    objDadosHotspot['createTooltipFunc'] = hotspot;
                                }
                            }
                        }
                    }
                }
    

    我不知道这是否是实现结果的最佳方式,但它确实有效。谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      • 2015-08-29
      • 2014-11-24
      • 1970-01-01
      • 2012-07-24
      • 2011-01-21
      • 1970-01-01
      相关资源
      最近更新 更多