【问题标题】:Cannot Access Restructured Array Passed to jQuery from PHP无法访问从 PHP 传递给 jQuery 的重组数组
【发布时间】:2015-01-28 19:27:44
【问题描述】:

我正在尝试重建一个对象数组,以将具有等效键的对象组合在一起以传递给 jQuery 函数。目前,我有一个这样的数组:

$myOldArr =

Array
(
    [0] => stdClass Object
        (
            [id] => 10
            [class] => atest
            [name] => atestvar1
        )

    [1] => stdClass Object
        (
            [id] => 6
            [class] => btest
            [name] => btestvar1
        )

    [2] => stdClass Object
        (
            [id] => 7
            [class] => btest
            [name] => btestvar2
        )

    [3] => stdClass Object
        (
            [id] => 8
            [class] => ctest
            [name] => ctestvar1
        )
)

我根据上面数组中的“class”键将它转换成这个分组。

$myNewArr =

Array
(
    [atest] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 10
                    [class] => atest
                    [name] => atestvar1
                )

        )

    [btest] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 6
                    [class] => btest
                    [name] => btestvar1
                )

            [1] => stdClass Object
                (
                    [id] => 7
                    [class] => btest
                    [name] => btestvar2
                )

        )

    [ctest] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 8
                    [class] => ctest
                    [name] => ctestvar1
                )

        )
)

我的目标是传递这个重建的数组,以便我可以根据每个“类”下的对象数量动态创建一些 DOM。但是,当我将 php 中的新数组的一部分传递给 jQuery 时

foreach (array_keys($myNewArr) as $item) {
?>
    <div onclick="myjQueryFcn(<?php echo json_encode($myNewArr[$item]); ?>)></div>
<?php
}

jQuery 无法执行该函数。如果我没有json_encode 数组,jQuery 会检测到为参数发送的函数。

编码表明我得到了例如$myNewArr[$item="btest"]的以下json对象:

[{"id":"6","class":"btest","name":"btestvar1"},{"id":"7","class":"btest","name":"btestvar2"}]

myjQueryFcn 当前只是在提醒输出。

function myjQueryFcn(json) {
    alert(typeof json);
}

我的新数组的结构有问题吗?我一直在为此苦苦挣扎,并且对于我所做的所有搜索和我尝试过的解决方案,似乎没有任何效果。

【问题讨论】:

    标签: php jquery arrays object


    【解决方案1】:

    这里的问题是引用:您的 json 字符串包含双引号,这会破坏 onclick="..." 引用。

    你可以使用

    onclick='...'
    

    或在您的字符串中使用 html 实体:

    onclick="myjQuerFcn([{&quot;id&quot;:&quot;6&quot;,&quot;class&quot;:&quot;btest&quot;,&quot;name&quot;:&quot;btestvar1&quot;},{&quot;id&quot;:&quot;7&quot;,&quot;class&quot;:&quot;btest&quot;,&quot;name&quot;:&quot;btestvar2&quot;}])"
    

    这也很丑。

    您也可以先在脚本中创建一个 javascript 变量:

    <script>
    var obj = '<?php json_encode($myNewArr[$item="btest"]); ?>'
    </script>
    <div onclick="myjQueryFcn(obj);"></div>
    

    更不用说这不是编程的艺术......

    更好的解决方案是使用 ajax 获取您的 (json) 数据,但这需要更多的基础设施:

    // java script part:
    $.getJSON('php-script.php', function(data){
       $.each(data,function(index,entry) {
           var div = $('<div></div>').on('click', function() {
              alert(entry); // [Object]
           }
           $(document).append(div);
       });
    });
    

    --

    <?php
    // php-script.php:
    echo json_encode($myNewArr);
    

    【讨论】:

    • 感谢您的回复,亚历克斯。我什至不确定我是否会自己发现这一点。考虑到使用 JSON 传递 PHP 对象的建议,这似乎是一个奇怪的情况。是否有更合适的方法来编码/传递对象? JSON 按标准应该是双引号,而我也在努力遵守 xhtml 标准。您的最后一个解决方案似乎很草率,特别是考虑到这可能会在多个位置重复使用...
    • 在传递 PHP 对象时使用 JSON 的建议意味着如果您使用 HTTP 请求从后端加载数据 - 但在您的情况下,您是在页面本身内生成数据,这不是很不错,反正。例如,您可以使用 ajax 请求异步加载数据。
    • 刚刚更新了上面的条目,添加了一个 AJAX 示例,从服务器异步获取数据。希望对您有所帮助。
    • 我想现在我已经使用 PHP 类从 mySQL 数据库中提取数据。我可以将其更改为直接从 JS 端提取,但随后我会在一页中对数据库进行重复调用。
    • 不,你误会了:数据库逻辑保留在后端 - 在你的情况下是 PHP 部分 - 你只从你的服务器分别从前端(javascript)获取数据,而不是生成一个包含所有内容的 html 文件 - 您将视图(html/js)与数据(php)分开。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2018-07-25
    • 2015-08-21
    • 2019-08-02
    • 2012-06-01
    相关资源
    最近更新 更多