【问题标题】:Converting PHP array to JavaScript将 PHP 数组转换为 JavaScript
【发布时间】:2014-12-20 04:33:17
【问题描述】:

我知道有很多关于将 PHP 数组转换为 Javascript 的问题,标准答案如下:

tempary=<?php echo json_encode($tmpary); ?>;

但是,当我尝试访问数组时,我无法访问元素。例如

document.write(tempary[2]);                                 //debug

即使我知道有第三个元素。

下面是实际代码:

global $wpdb;
$query="SELECT * FROM wp_ta_members";
$member_table=$wpdb->get_results($query);
echo "<p>Size of wp_ta_members table is " . count($member_table) . "</p>";      //debug
?>
<script type="text/javascript">
var members = [];
var tempary = [];
</script>
<?php
foreach ($member_table as $member_row)
    {
    $tmpary=array($member_row->member_id,
    ($member_row->current==1)?"current":"not a member",
    $member_row->date_joined,
    $member_row->title,
    $member_row->first_names,
    $member_row->last_names)
    ?>
    <script type="text/javascript">
    tempary=<?php echo json_encode($tmpary); ?>;
    document.write(tempary[2]);                                 //debug
    console.log(tempary);                                   //debug
    members.push(tempary.concat());
</script>
<?php   }
?>

你会注意到我实际上是在创建一个数组数组,稍后我会使用以下循环处理:

for (mem in members)
{
document.write(workary.length + " " + members.length + " " + mem.length + " " + members[1] + "<br />");     //debug
document.write(mem[1] + " " + mem[2] + " " + mem[3] + " " + mem[4] +"<br />");      //debug
}

但是,对于 tempary[0],我得到的只是“1”,而对于任何其他元素 - “未定义”。

如果我输出 tempary 本身,我会得到一个由逗号分隔的所有元素组成的字符串。

我错过了什么?我希望 tempary 成为一个合适的 JavaScript 数组。

很抱歉再次回来,但这仍然不起作用

我在脚本中添加了以下代码,只是为了检查这个概念:

var a1 = [100, "scooby", "doo"];
var a2 = [200, "soup", "dragon"];
var a3 = [];
a3.push(a1);
a3.push(a2);
console.log(a3);
console.log(a3[0]);
console.log(a3[1]);
console.log(a3[1][0] + " " + a3[1][1]);

结果是:

[Array[3], Array[3]]
[100, "scooby", "doo"]
[200, "soup", "dragon"]
200 soup

这是正确的!

当我运行我的真实代码并执行这些行时(在一个循环中):

    console.log(tempary);                                   //debug
    members.push(tempary);

我得到了结果:

["78", "current", "2014-01-01", "", "Fred", "Bloggs"]

这也是正确的(虽然我更喜欢将“78”存储为数字而不是字符串 - 但这是另一回事)。

但是,当我执行一个循环以打印出数组数组的内容时,使用:

for (mem in members)
    {
    console.log(members.length + " " + mem.length + " " + members[1]);      //debug
    console.log(mem + " " + mem[0] + " " + mem[1] + " " + mem[2] + " " + mem[3] + " " + mem[4]);        //debug

    }

我得到一个重复的日志列表:

1333 1 8000,current,2014-01-01,Ms,Joe,Soap
0 0 undefined undefined undefined undefined
1333 1 8000,current,2014-01-01,Ms,Joe,Soap
1 1 undefined undefined undefined undefined
1333 1 8000,current,2014-01-01,Ms,Joe,Soap
2 2 undefined undefined undefined undefined
1333 1 8000,current,2014-01-01,Ms,Joe,Soap
3 3 undefined undefined undefined undefined
1333 1 8000,current,2014-01-01,Ms,Joe,Soap
4 4 undefined undefined undefined undefined
1333 1 8000,current,2014-01-01,Ms,Joe,Soap
5 5 undefined undefined undefined undefined
1333 1 8000,current,2014-01-01,Ms,Joe,Soap
6 6 undefined undefined undefined undefined
1333 1 8000,current,2014-01-01,Ms,Joe,Soap
7 7 undefined undefined undefined undefined
1333 1 8000,current,2014-01-01,Ms,Joe,Soap
8 8 undefined undefined undefined undefined
1333 1 8000,current,2014-01-01,Ms,Joe,Soap
9 9 undefined undefined undefined undefined
1333 1 8000,current,2014-01-01,Ms,Joe,Soap
10 1 0 undefined undefined undefined
1333 1 8000,current,2014-01-01,Ms,Joe,Soap
11 1 1 undefined undefined undefined
1333 1 8000,current,2014-01-01,Ms,Joe,Soap
12 1 2 undefined undefined undefined

其中 1333 是成员数组中的数组数。 Joe Soap 是列表中的最后一个成员。 为什么 console.log(mem);产生一个递增的数字,我不知道。当这个数字变成两位数时,会发生更奇怪的事情,例如12 使 mem[0] = 1 和 mem[1] =2 !! mem 的其余元素是“未定义的”。

为了完整起见,这里是整个脚本:

<?php
/***** php and javascript to administer member details *****/

// **** get entire members table into a variable
    global $wpdb;
    $query="SELECT * FROM wp_ta_members";
    $member_table=$wpdb->get_results($query);
    echo "<p>Size of wp_ta_members table is " . count($member_table) . "</p>";  //debug
?>
<script type="text/javascript">
    var members = [2000];
    var tempary = [];
    var a1 = ["100", "scooby", "doo"];      //test
    var a2 = ["200", "soup", "dragon"];     //test
    var a3 = [];        //test
    a3.push(a1);        //test
    a3.push(a2);        //test
    console.log(a3);
    console.log(a3[0]);
    console.log(a3[1]);
    console.log(a3[1][0] + " " + a3[1][1]);
<?php
    foreach ($member_table as $member_row)
        {
        $tmpary=array($member_row->member_id,
        ($member_row->current==1)?"current":"not a member",
        $member_row->date_joined,
        $member_row->title,
        $member_row->first_names,
        $member_row->last_names);
        $x = 0;
        foreach($tmpary as $value){
            echo 'tempary[' . $x . '] = "' . $value . '";';
            $x++;
            }
?>
//      tempary=JSON.parse("<?php echo json_encode($tmpary); ?>");
        document.write(tempary[4] +"<br />");       //debug
        console.log(tempary);           //debug
        members.push(tempary);
<?php       }
?>
    document.write(members + "<br />");     //debug
    document.write("Hi Will again<br />");      //debug
    for (mem in members)
        {
        console.log(members.length + " " + mem.length + " " + members[1]);  //debug
        console.log(mem + " " + mem[0] + " " + mem[1] + " " + mem[2] + " " + mem[3] + " " + mem[4]);    //debug

        }
</script>

我已经为此苦苦挣扎了好几天,但没有什么想法。任何帮助将不胜感激。

【问题讨论】:

  • 我建议你将数组值放在html元素中,然后在JS中调用这些元素并将其存储在数组中。
  • 你试过console.log(tempary)吗?它的结果是什么?此外,您将 $tmpary 写为 PHP 变量。可能是笔误。
  • 'tempary = JSON.parse("");'然后控制台.log(临时);如果您的对象处于开发人员模式,请查看结构是什么。
  • console.log(tempary) 的结果是:["78", "current", "2014-01-01", "Mr", "Fred", "Bloggs"] 。也就是说,正如我所说的逗号分隔列表。是的 - $tmpary 是一个 PHP 变量。这是我要复制到 JavaScript 数组的数组。我会尝试 JSON.parse 的想法。

标签: javascript php arrays


【解决方案1】:

在声明JS数组后,使用foreach循环并在每次迭代中写出JS代码:

<script>

var js_array = new Array();

<?php

    $x = 0;

    foreach($item as $key => $value){

        echo 'js_array[$x] = "' . $value . '";';

        $x++;
    }

?>

</script>

【讨论】:

  • &lt;?php $x = 0; foreach($member_row as $value){ echo 'tempary[' . $x . '] = "' . $value . '";'; $x++; } ?&gt;
  • 我不得不将你的代码修改为:&lt;?php $x = 0; foreach($member_row as $value){ echo 'tempary[' . $x . '] = "' . $value . '";'; $x++; } ?&gt; 但还是不行。
【解决方案2】:

我看到您在每次迭代时都覆盖了您的临时数组。因此,当您进行 json_encode 时,您只剩下最后一项。

试试这个:

global $wpdb;
$query="SELECT * FROM wp_ta_members";
$member_table=$wpdb->get_results($query);
echo "<p>Size of wp_ta_members table is " . count($member_table) . "</p>";      //debug
?>
<script type="text/javascript">
<?php
$members = array();
foreach ($member_table as $member_row){
    $member = array(
        $member_row->member_id,
        ($member_row->current==1)?"current":"not a member",
        $member_row->date_joined,
        $member_row->title,
        $member_row->first_names,
        $member_row->last_names
    );
    $members[] = $member;
}
?>
var members = <?php echo json_encode($members) ?>;
</script>
<?php   }
?>   

【讨论】:

  • 感谢您的帮助。你是对的,我在每次迭代时都使用覆盖临时文件,但我也使用 members.push() 将临时文件的内容每次添加到成员中,以便我可以重用临时文件。不过我会尝试你的解决方案。
  • 谢谢killneel。但是,我想得到一个数组数组。也就是说 members[] 是 member[] 数组的数组。上面的好像不行。
  • 我的答案实际上是在php中建立了一个多维数组(成员数组的数组),然后回显出该php数组的json字符串。您可以看到,在 foreach 循环的每次迭代中,$member 都被初始化并填充了表格行中的值。然后将该数组推送到成员数组上,以便最终成员是一个数字索引数组,其中的每个元素都由一个数组组成。
  • 终于明白你说的覆盖临时是什么意思了。似乎将其推入外部数组的元素只能作为指向原始数组的指针,因此如果该原始数组被覆盖,外部(2D)数组中的数据也会被反映。这就是为什么我得到最终数组的无数副本(或者看起来如此)的原因。感谢您指出这一点。
【解决方案3】:

我发现了我的问题所在。尤其是 killneel,他提出了一个非常优雅的二维数组问题解决方案。 原来问题的症结在于我访问数组的方式。仅供参考永远不要使用 for..in 循环来处理数组!使用起来好多了:

var len = arr.length;
for (var i=0; i<len; i++) {
    console.log(arr[0];     // or whatever you want to do with the array element
    }

【讨论】:

猜你喜欢
  • 2011-08-02
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 2017-03-29
  • 1970-01-01
相关资源
最近更新 更多