【问题标题】:Create a Javascript array from a PHP array从 PHP 数组创建 Javascript 数组
【发布时间】:2013-05-23 18:11:18
【问题描述】:

我在从 PHP 数组转换为 Javascript 数组然后访问该值时遇到问题。我试过 JSON 编码和解码。

PHP:

$simpleArray= [];   
$childProducts = Mage::getModel('catalog/product_type_configurable')
    ->getUsedProducts(null,$_product);   
foreach($childProducts as $child) { //cycle through simple products to find applicable
    $simpleArray[$child->getVendor()][$child->getColor()] = $child->getPrice();
    var_dump ($simpleArray);
}

Javascript:

var simpleArray = <?=json_encode($simpleArray)?>;
//..lots of unrelated code
for(var i=0; i < IDs.length; i++)
{   
    console.log(simpleArray);
    //which color id is selected 
    var colorSelected = $j("#attribute92 option:selected").val();
    console.log('Value of color selected is ' + colorSelected);
    $j('.details'+data[i].vendor_id).append('<li class="priceBlock">$'+simpleArray[i][colorSelected]+'</li>');
}

编辑: 我已经摆脱了 php 中的 simpleArrayJson 声明并更改了 javascript 的第一行。

【问题讨论】:

  • 不要 json_decode 它,你想要它的 json 格式。我对php不太熟悉,但是你的第二个sn-p第一行中的(array)是什么?
  • 这是 PHP json_encode 文档中某人的建议。我已将其删除。我现在只有 var simpleArray = =json_encode($simpleArray)?>;我现在的问题是像访问数组一样访问值:simpleArray[i][colorSelected]。除了 $child->getPrice() 是美元值之外,所有变量都是整数。
  • 我不明白为什么您的 console.log 中会出现 function Array() { [native code] }。你用什么浏览器测试?
  • chrome...嗯...在 Firefox 中看起来很糟糕。
  • 哦,对不起,那是在我把 json_encode 放在那里之前。它记录一个对象。同样,现在我只需要能够访问该值 simpleArray[i][colorSelected]。那里的那些变量将是整数。

标签: php javascript jquery magento


【解决方案1】:

您没有理由json_decode() 您尝试输出的值。直接回显就好了:

var simpleArray = <?= $simpleArrayJson ?>;

这将输出一个 javascript 对象字面量。

【讨论】:

  • var simpleArray = =json_encode($simpleArray)?>;我的其余代码不起作用
  • @CaitlinHavener 那是因为simpleArray 不是数字索引数组。它是一个对象字面量。您要么需要修改编码为 JSON 的数据结构,要么修改在 javascript 中使用它的方式。查看输出的结构,以更好地了解如何使用它。
  • @CaitlinHavener 好吧,我想回到基础。你知道 PHP 中数字索引数组和关联数组的区别吗?在 javascript 中,你知道数字索引数组和对象(最接近 javascript 中的关联数组)之间的区别吗?
  • 您是否理解在您的 PHP 中,您似乎正在构建一个关联数组(除非 $child-&gt;getVendor() 返回整数值)?此外,当您将JSON_FORCE_OBJECT 标志与json_encode() 一起使用时,即使您有一个数字索引数组,也会导致在您的JSON 序列化中形成一个对象。然后,您尝试使用数字索引在 JS 中访问 simpleArray,这是您无法创建的。你有一个 javascript 对象,你需要访问它。或者,您可以在 PHP 中构建一个真正的基于 0 的数字索引数组,而不使用 JSON_FORCE_OBJECT
  • Ahhh.. 它是 PHP 中的数字索引数组。 $child->getVendor() 和 $child->getColor() 值是整数。我已经删除了 force 对象,但它仍然是一个 json 对象。我需要能够访问示例 simpleArray[4][5] 的值,例如 1.50。我不知道该怎么做。在“编辑”下,您可以看到我所做的更改。
【解决方案2】:

从 php 中删除。

$simpleArrayJson=json_encode($simpleArray, JSON_FORCE_OBJECT);

在这里,您将 php 数组转换为 json 字符串。

更改 javascript

var simpleArray = <?= json_encode($simpleArray, JSON_FORCE_OBJECT); ?>;

在这里,您只是在输出刺痛。以前你在哪里做这个

var simpleArray = <?=(array) json_decode($simpleArrayJson)?>

在 json_decode 返回一个数组之后,您将其转换为一个数组,然后由&lt;?= 转换为一个字符串,因此最终进入浏览器的内容类似于:

var simpleArray = Array; 

【讨论】:

    【解决方案3】:

    尝试 for in 循环。

    for( item in data ) {
        console.log(data[item]);
    }
    

    这是因为 json 具有与 json_encoded 数组的索引匹配的键,而不是 0->n 索引。

    编辑感谢 cmets 将 data.item 更改为 data[item]

    【讨论】:

    • for(simpleArray 中的项目) { console.log(simpleArray.item); }
    • 不应该是console.log(item) 还是console.log(data[item])console.log(data.item) 是错误的,除非 data 具有 item 属性。
    猜你喜欢
    • 2013-10-29
    • 2012-01-14
    • 2013-10-03
    • 1970-01-01
    • 2011-12-26
    • 2016-02-06
    • 1970-01-01
    • 2013-12-30
    • 2013-06-22
    相关资源
    最近更新 更多