2

背景:

我正在构建的这个应用程序中有一个类,其工作是:

  • __构造:$this->data = $this->mongoDB->collection->findOne();
  • 中间函数用于以数十种不同的方式处理每个请求的数据。一种操作可能会触发一种操作,而这种操作会触发另一种操作。这允许我只用一个查询就可以对 mongo 文档进行无限更新,只要$this->data['_id']保持不变。这是唯一允许对该特定集合进行数据操作的地方。
  • __破坏:$this->monboDB->collection->save($data)
  • 然后将数据读回,json_encode'd 并发送到 Javascript 以绘制页面

意图:

我打算通过循环遍历所述数组,匹配其中的值并取消设置来删除数组的成员。例子:

foreach($this->data['documents'] as $key => $val){
    if($val == $toBeDeleted){
        unset($this->data['documents'][$key];
    }
}

然后,当脚本完成时,这将被保存到数据库中。

问题:

当 javascript 读回数据时['a', 'b', 'd'],我有{'0': 'a', '1': 'b', '3': 'd'}- 不能像数组一样处理,而且会破坏很多东西。

4

1 回答 1

4

在我的 a-hah之前,我已经把这个问题打了一半!时刻,所以我想我也会发布我自己的答案以供将来参考。

在php中,关联数组和数组都是一样的。您可以使用乱序键、非连续键以及您想在调用数组成员时使用的几乎任何键。大多数(如果不是全部)php 数组函数可与任何数组键一起使用。对象是完全不同的东西。

话虽如此,Javascript 并不共享相同的数组规则。javascript 数组必须具有从零开始的连续键,否则它是一个对象。MongoDB 在这方面类似于 Javascript。

当 php 转换一个对象以在 MongoDB 或 Javascript 中使用时,如果 php 数组不遵循该规则,它将成为一个 Javascript 对象。

问题是在取消设置数组索引后,它留下了一个间隙,导致数组键不连续,导致它成为一个对象。简单的修复要么是array_slice($array, $key, 1)要么$array = array_values($array)

于 2013-02-13T18:16:47.410 回答