【问题标题】:Associative & Index Array关联和索引数组
【发布时间】:2014-01-22 01:07:20
【问题描述】:

我用我的 SQL 数据库中的mysql_fetch_array 创建了一个 PHP 数组。 我用 ajax 和 jQuery 将它检索到 JavaScript。

我的问题是 JavaScript 创建了两个数组,一个是简单的,一个是关联的,而不是 PHP 两者合二为一。

当我通过使用索引值myArray[0] 访问单元格来更新它时,同一单元格myArray['col1'] 的关联值不会更新。

有没有办法从索引值中获取独立单元格中的键,以便我可以同时更新两个数组?

更新:

这是生成数组 (XY) 的 PHP 代码。

 $query = mysql_query("SELECT * FROM details_moteurs ORDER BY m_no_inventaire ASC")
    $i=0;
    while ($infosMoteurs = mysql_fetch_array($query)) {
        $arrayMoteur[$i] = $infosMoteurs;
        $i++;
    }

我的表 details_moteurs 的第一列是 m_id

// javascript code
Alert($arrayMoteur[0][0]) // give '1524'
Alert($arrayMoteur[0]['m_id']) // give me  '1524'

但如果我想更新我的二维数组的单元格:

$arrayMoteur[0][0] = 'xyz';  
alert($arrayMoteur[0]['m_id']) // give me '1524'

同样:

   $arrayMoteur[0]['m_id'] = 'xyz';  
   alert($arrayMoteur[0][0]) // give me '1524'

我的问题是我使用了循环:

 for(x = 0;x < arraySize;x++){
       for(y = 0;y < lineSize;x++){
            if(something){
                 $arrayMoteur[x][y] = 'xyz';
            }
        }
    }

================================================ =================

好的,我修好了。

我将 mysql_fetch_array 替换为 mysql_fetch_assoc 以仅获得一个数组,并且我更正了我的循环:

for(var x in array)
       for(var y in array[x]){
            if(something){
                 $arrayMoteur[x][y] = 'xyz';
            }
        }
    }

【问题讨论】:

  • Javascript 是如何“创建”2 个数组的?我不确定您所说的“在 PHP 中两者合而为一”是什么意思
  • 也许您应该向我们展示生成 ajax 响应(以及响应主体本身)的 PHP 代码……
  • 这就是 JQuery 所做的:纯黑魔法;)。向我们展示你的咒语,我们会看到 shazam 出了什么问题。

标签: javascript php arrays associative-array


【解决方案1】:

Javascript 不会创建两个单独的数组——它只是创建一个对象,您可以通过关联数组语法在其中引用它的属性。在您的控制台中尝试以下操作:

var test = [];
test[0] = "value0";
test["col1"] = "value1";
test["col2"] = "value2";
console.log(test.length);

如果你运行上面的代码,你会看到数组的长度实际上只是 1。键 "col1" 和 "col2" 的值作为属性添加到数组对象中,而不是作为数组中的条目.假设您添加到 javascript 数组的所有条目都是字符串(例如,所有 php 生成的键都是字符串),那么您可以使用以下命令轻松循环遍历所有键:

for (key in test) { 
    console.log( test[key] ); 
}

我们示例中的上述代码将打印出来:

value0
value1
value2

希望这可以清除您的 javascript 数组/对象发生的情况。

更新:如果您需要/希望 0..n 元素与您的属性相匹配,您可以在使用关联引用创建初始 javascript 对象后执行此操作:

var test = [];
test["col1"] = "value1";
test["col2"] = "value2";

var i = 0;
for (key in test) { 
    test[i] = test[key];
    i++; 
}

在上面的示例中,您实际上会得到 4 个键。运行此代码:

for (key in test) { 
    console.log( "[" + key + "] --> " + test[key] ); 
}

输出:

[0] --> value1
[1] --> value2
[col1] --> value1
[col2] --> value2

但是,您也可以像这样使用索引计数来提取两个关联值:

for (var j = 0; j < test.length; j++) {
    console.log( "[" + j + "] --> " + test[j] );
}

这将只打印如下 2 个值:

[0] --> value1
[1] --> value2

再次,希望这会有所帮助!

【讨论】:

  • 您好,当您使用 mysql_fetch_array 从 SQL 查询构建数组时,您可以使用 myArray[0]myArray['sqlCol0Name'] 访问您的数组。但是,如果您尝试使用 myArray[0] = 'xxx'; 更新值并使用 alert(myArray['sqlCol0Name']); 访问它,旧值仍然存在,只有 alert(myArray[0]); 会返回更新后的值。
  • myArray[0] 和 myArray['sqlCol0Name'] 在 Javascript 中不是一回事。 Javascript 不是 PHP。创建 javascript 对象后,对数组中第 0 个元素的引用与对名为“sqlCol0Name”的属性的引用不同。
  • 我的问题不是获取已经有效的值,而是覆盖它们,请参阅更新的第一篇文章。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-10
  • 2018-11-16
相关资源
最近更新 更多