【问题标题】:Convert PHP array to JS array (ISO 8859-1 characters)将 PHP 数组转换为 JS 数组(ISO 8859-1 字符)
【发布时间】:2017-03-09 15:47:23
【问题描述】:

尽管有所有来源,但我无法让它工作。我尝试以下方法:

<?php
$list_array = array();
foreach ($this->resultatTypeMail as $mailType) {
    $nom          = $mailType->getNom();
    $objet        = $mailType->getObjet();
    $list_array[] = array(
        'Name'   => $nom,
        'Object' => $objet,
    );
    echo "<script type='text/javascript'>alert('$nom');</script>"; // this is OK
    echo "<script type='text/javascript'>alert('$objet');</script>"; // this is OK
}
?>
<script type="text/javascript">
 var js_array = [<?php echo json_encode( $list_array ); ?>];
 alert(js_array[0]); // This returns undefined
</script>

当我提醒他们时,我在 $nom$objet 上得到了令人满意的结果。

问题: js_array[0] 返回undefined

请注意,我不在 UTF-8 中。不过我不确定它是否相关。

编辑:我的目标是获得一组可在 JS 中使用的自定义 php 对象。

【问题讨论】:

  • 替换 var js_array = []; with var js_array = [];并检查
  • 我相信 json_encode 将具有字符串值的数组编码为 JSON 对象的数组键,而不是数组。
  • 我检查了我之前的评论,这是真的。您的解决方案是使用 array_values,因此它已正确转换为数组。或者在您的 javascript 中使用 js_array.Name
  • print_r($list_array) 查看foreach后的结果

标签: javascript php arrays


【解决方案1】:

只需从 var js_array = 行中删除 [] 即可:

错误

var js_array = [<?php echo json_encode( array_values($list_array) ); ?>];

var js_array = <?php echo json_encode( array_values($list_array) ); ?>;

工作代码:

<?php

class MailType {
   function __construct($n, $o) {
       $this->nom = $n;
       $this->objet = $o;
   }

    private $nom;
    private $objet;

    public function getNom() {
        return $this->nom;
    }

    public function getObjet() {
        return $this->objet;
    }

}

$list_array = array();
$resultatTypeMail = array(new MailType('John', 'obj1'), new MailType('Mary', 'obj2'));
foreach ($resultatTypeMail as $mailType) {
    $nom          = $mailType->getNom();
    $objet        = $mailType->getObjet();
    $list_array[] = array(
        'Name'   => $nom,
        'Object' => $objet,
    );
    //echo "<script type='text/javascript'>alert('$nom');</script>"; // this is OK
    //echo "<script type='text/javascript'>alert('$objet');</script>"; // this is OK
}
?>
<script type="text/javascript">
 var js_array = <?php echo json_encode( $list_array ) ?>;
 alert(js_array[0].Name); // This returns John
</script>

你可以看到它在这里运行:http://phpfiddle.org/main/code/5xei-ybpn

(按 F9 或点击“运行 - F9”运行)

【讨论】:

  • 我在回答中说过,似乎不适用于 OP...[ ] 也不是错误alert 无论如何都应该工作和他们一起……
  • @MikO 对不起我之前的评论,我把答案弄混了。
  • 您的代码有效,我确认。我会尝试将其切换到我的需要,看看发生了什么,我会在这里报告。
  • 我将您的答案标记为已接受,尽管我相信所有答案都是正确的,并回答了我原来的问题。原来你们无法解决我的问题,因为我的数组没有正确获取,但你的回答让我找到了真正的问题。谢谢大家!
  • 你能和我们分享一下,真正的问题是什么?
【解决方案2】:

在 PHP 中,具有字符串键的数组在使用 json_encode 解析时会转换为对象。

您可以使用 array_keys 来强制创建一个数组,或者在您的 javascript 中使用对象表示法

<?php
$list_array = array();
foreach ($this->resultatTypeMail as $mailType) {
    $nom          = $mailType->getNom();
    $objet        = $mailType->getObjet();
    $list_array[] = array(
        'Name'   => $nom,
        'Object' => $objet,
    );
    echo "<script type='text/javascript'>alert('$nom');</script>"; // this is OK
    echo "<script type='text/javascript'>alert('$objet');</script>"; // this is OK
}
<script type="text/javascript">
 var js_array = [<?php echo json_encode( array_values($list_array) ); ?>];
 alert(js_array[0]); 
</script>

或者

<?php
$list_array = array();
foreach ($this->resultatTypeMail as $mailType) {
    $nom          = $mailType->getNom();
    $objet        = $mailType->getObjet();
    $list_array[] = array(
        'Name'   => $nom,
        'Object' => $objet,
    );
    echo "<script type='text/javascript'>alert('$nom');</script>"; // this is OK
    echo "<script type='text/javascript'>alert('$objet');</script>"; // this is OK
}
<script type="text/javascript">
 var js_array = [<?php echo json_encode( array_values($list_array) ); ?>];
 alert(js_array.Name); 
</script>

【讨论】:

  • 由于 OP 用方括号 [ ] 将 JSON 括起来,因此结果应该是一个数组,其中仅包含 1 个项目,其中包含整个 JSON 字符串,这可能不是 OP 想要的,但是 @ 987654324@ 应该可以在不需要array_values 或任何东西的情况下工作......我认为这不是解决方案......
  • 两种解决方案我仍然得到“未定义”:/
  • 我在这里测试了您的代码,您有 3 个错误:您忘记了两个版本中的结束 ?> 标记,并且第二个版本仍然未定义警报。
【解决方案3】:

我认为您有多个问题:您在json_encode() 行之后缺少;(这实际上不是必需的);你用括号括住json_encode() 的结果(应该可以,但我希望这不是你想要的);最重要的是,您在打印 JS 之前缺少结束 PHP ?&gt; 标记...

这对我有用:

<?php
    // your PHP code here...
?>

<script type="text/javascript">
   var js_array = <?php echo json_encode($list_array); ?>;
   alert(js_array[0]); // This works for me!
</script>

正如您所说,问题可能出在编码中 - 似乎json_encode 仅适用于 UTF-8!来自json_encode() docs

所有字符串数据必须是 UTF-8 编码。

所以我认为您必须先将字符串转换为 UTF-8,然后再将它们放入数组中,例如:

$list_array[] = array(
    'Name'   => utf8_encode($nom),
    'Object' => utf8_encode($objet),
);

认为这应该可行 - 否则您可以在同一 json_encode() 文档中尝试来自 cmets 的 this;或this其他问题以获得更多想法...

【讨论】:

  • 之前?>;是可选的
  • 我根据你的智慧进行了编辑,但对我来说仍然“未定义”
  • 真的!我已经很久没有使用纯 PHP 脚本工作了,以至于我不记得上次我使用结束标记是什么时候了 :)
  • 伙计,这确实是编码的问题。我使用的是 iso 8859-1,我会尝试看看切换到 UTF 8 是否能解决我的问题……不过会是个问题。
猜你喜欢
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 2014-07-04
  • 2020-01-25
相关资源
最近更新 更多