将PHP数组转换为JavaScript

222

如何将PHP数组转换成以下格式

Array
(
    [0] => 001-1234567
    [1] => 1234567
    [2] => 12345678
    [3] => 12345678
    [4] => 12345678
    [5] => AP1W3242
    [6] => AP7X1234
    [7] => AS1234
    [8] => MH9Z2324
    [9] => MX1234
    [10] => TN1A3242
    [11] => ZZ1234
)

如何将以下格式的数据转换为Javascript数组?

var cities = [
    "Aberdeen",
    "Ada",
    "Adamsville",
    "Addyston",
    "Adelphi",
    "Adena",
    "Adrian",
    "Akron",
    "Albany"
];

3
你能澄清你的问题吗?你是真的想创建一个 JavaScript 数组,还是想创建一个可以放在 script 标签中以创建它的字符串,或者试图创建 JSON 以回复 ajax 请求,或者……(另外,在提问时,值得查看右侧的“如何格式化”框和从问题区域上方的 [?] 链接到的页面。) - T.J. Crowder
22个回答

495

我假设你提供的 PHP 和 JS 两个数组并不相关,它们只是展示两种语言中数组的形式。很明显,你无法将那些字母和数字的序列转换为城市名称。

PHP 提供了一个函数用于将 PHP 数组转换为 JavaScript 代码:json_encode() (严格来说,这是 JSON 格式; JSON 代表 JavaScript 对象表示法)

使用方法如下:

<script type='text/javascript'>
<?php
$php_array = array('abc','def','ghi');
$js_array = json_encode($php_array);
echo "var javascript_array = ". $js_array . ";\n";
?>
</script>

请查看我上面链接的手册页面获取更多信息。

请注意,json_encode()仅适用于PHP 5.2及以上版本,因此如果您使用的是旧版本,则需要使用现有的JSON库。 PHP手册页面还包括一些由需要它的人编写的函数的评论。(但是,如果您使用的是低于PHP 5.2的任何旧版本,则应尽快升级)


你在javascript数组的末尾缺少了一个分号,而且那不是PHP数组初始化的方式(尝试使用array('abc'....))... 无论如何都要点赞,因为这可能是OP想要的。 - Daniel Sloof
@Spudley 你好,我尝试了这个方法,在 JavaScript 中尝试访问 PHP 创建的数组,如下所示:console.log('stuff: ' + javascript_array[0]);,但它显示 javascript_array 未定义。 - user3871
毫无疑问,这是 OP 想要的最佳方法。我在想 JSON 对象是否真的与数组相同…我的意思是,考虑一种情况,我想检查一个值是否存在于我的数组中,并执行 jsonEncodedObject.indexOf('my string') > -1,这很可能会抛出错误。为了使其工作,jsonEncodedObject 应该是一个形式为 ['my string', 'a string', 'some string', 'other string' ] 的数组。我尝试了一下,结果正如我所预期的那样。 - Fr0zenFyr
1
只是想指出,json_encode 定义了一个 JavaScript 对象,而不是数组。 - Patrick Moore
1
@PatrickMoore - 如果你要对此挑剔,json_encode输出一个JSON字符串,它可以表示JS对象或JS数组,甚至是单个标量值,如果你传递的是这样的参数。我回答中的示例将输出JavaScript数组,而不是对象。 - Spudley
显示剩余3条评论

65

Spudley的回答很好

安全提示:以下内容对您来说可能不再必要

如果您没有PHP 5.2,可以使用类似于以下内容:

function js_str($s)
{
    return '"' . addcslashes($s, "\0..\37\"\\") . '"';
}

function js_array($array)
{
    $temp = array_map('js_str', $array);
    return '[' . implode(',', $temp) . ']';
}

echo 'var cities = ', js_array($php_cities_array), ';';

2
如果你正在使用旧版的PHP,那么你需要自己编写代码。然而,如果有可能,你也应该考虑升级你的PHP版本! - Spudley
6
即使您正在使用旧版的PHP,也不要自己编写代码,而是使用一个被维护/被多个人/项目使用的现有库。因此,本答案仅展示如何完成某些操作,但无论PHP版本如何,都不应该推荐这种做法。例如,http://pear.php.net/package/Services_JSON。 - hakre
1
顺便提一下,添加了array_map调用。老实说,在不涉及任何安全问题的情况下,没有必要编辑一个完全有效的原始问题答案并标记为“安全通知”。 - Udo G
1
@UdoG:如果您不同意某个编辑,可以自己再次编辑。hakre的观点是,对于阅读此问题的人来说,使用已知为安全且经过充分测试的库(例如来自Pear)比仅凭代码本身更为明智。此外,值得指出的是,当提出这个问题时,PHP 5.2已经停止支持。就我现在所写的而言,它已经不受支持两年了,并且存在已知的安全问题,这些问题将不会得到修补。因此,在考虑此答案中的代码之前,仅仅使用PHP 5.2就已经是一个安全问题。 - Spudley
仅仅交换值(即 echo "jsArray.push(\"" . $result[$i]["column_name"] . "\");";)是否存在不安全的风险? - oldboy
显示剩余3条评论

44

愚蠢而简单:

var js_array = [<?php echo '"'.implode('","', $php_array).'"' ?>];

7
只是出于好奇,当字符串包含单引号、双引号和/或逗号时会发生什么? - Nis
1
由于已经有一个相关的函数,除非有充分的理由,否则应该优先选择使用它,而不是临时解决方案;本文未说明理由。 - cjbarth
在编程中,使用Unicode字符(例如我所用的乌尔都语)效果更佳。 - TheTechGuy

44

因为json_encode的输出是JavaScript字面量,所以你不必调用parseJSON。只需将它分配给一个js变量即可。

<script type="text/javascript">
    //Assign php generated json to JavaScript variable
    var tempArray = <?php echo json_encode($php_array); ?>;

   //You will be able to access the properties as 
    alert(tempArray[0].Key);
</script>

1
谢谢,这对于混合对象数组也很有效。非常简单高效! - iconique

24

你可以使用PHP的json_encode函数,将PHP数组转换为JavaScript格式。

<?php $phpArray = array(
          0 => 001-1234567, 
          1 => 1234567, 
          2 => 12345678, 
          3 => 12345678,
          4 => 12345678,
          5 => 'AP1W3242',
          6 => 'AP7X1234',
          7 => 'AS1234',
          8 => 'MH9Z2324', 
          9 => 'MX1234', 
          10 => 'TN1A3242',
          11 => 'ZZ1234'
    )
?>
<script type="text/javascript">

    var jArray= <?php echo json_encode($phpArray ); ?>;

    for(var i=0;i<12;i++){
        alert(jArray[i]);
    }

 </script>

4
那个循环非常糟糕。 - Eric
2
那只是为了演示而已 :) - Dipesh KC
7
@Eric,这个例子是直接从问题中复制下来的,我本可以使用console.log(),但问题本身非常基础(用户可能没有浏览器代码检查工具的经验),所以我决定使用alert(),因为用户会直接看到它。但你很清楚,这不是问题关注的部分,只是验证逻辑是否可行的一种方式。 - Dipesh KC

18

我发现在Javascript中与PHP数组一起使用的最快最简单的方法是这样的:

PHP:

$php_arr = array('a','b','c','d');

Javascript:

//this gives me a JSON object
js_arr = '<?php echo JSON_encode($php_arr);?>';


//Depending on what I use it for I sometimes parse the json so I can work with a straight forward array:
js_arr = JSON.parse('<?php echo JSON_encode($php_arr);?>');

你为什么要在JSON中加上引号,然后再解析它呢? - Your Common Sense

18

非常简单,我使用以下方式:

JAVASCRIPT

var arrayJavascript = <?php echo json_encode($arrayPhp) ?>;

PHP数组转换为Javascript

祝好!


15

你也可以用这种方式来做

<script>  
    <?php 
        $php_array = array('abc','def','ghi');
    ?>  
    var array_code = <?php echo json_encode($php_array); ?>;
    console.log(array_code);
</script>

14

如此简单...!

使用这种方法:

<?php echo json_encode($your_array); ?>; 

Laravel Blade 中使用{{ }}方法:

{{ str_replace('&quot;', '', json_encode($your_array)) }} 

用于关联数组和非关联数组的工作。


1
如果你信任用户数据,那么@MohammadKawsara使用的方法显然对我最有效。 - Tomas Crofty

3

这是我的函数。JavaScript 必须在 PHP 下使用,否则请使用 SESSION。

<?php
 $phpArray=array(1,2,3,4,5,6);
?>

<div id="arrayCon" style="width:300px;"></div>

<script type="text/javascript">
var jsArray = new Array();
<?php
 $numArray=count($phpArray);
 for($i=0;$i<$numArray;$i++){
  echo "jsArray[$i] = ". $phpArray[$i] . ";\n";
 }
?>
$("#arrayCon").text(jsArray[1]);
</script>

最后一行可以是....text(jsArray); 并且会显示为 "1,2,3,4,5,6"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接