array_udiff返回不同的结果

时间:2017-03-17 20:59:14

标签: php arrays json

我有这段代码来区分两个对象数组:

$diff = array_udiff($a, $b,
    function($obj_a, $obj_b) {
        return $obj_a->id - $obj_b->id;
    }
);

$ a是

[
  {
    "id": "7",
    "attribute": "instagram"
  },
  {
    "id": "8",
    "attribute": "snapchat"
  },
  {
    "id": "9",
    "attribute": "facebook"
  }
]

$ b是

[
  {
    "id": "7",
    "attribute": "instagram",
    "value": "somevalue"
  }
]

$ diff应该返回对象数组

[
  {
    "id": "8",
    "attribute": "snapchat"
  },
  {
    "id": "9",
    "attribute": "facebook"
  }
]

它确实如此,但只有当$ b是一个空数组时。结果是正确的(我得到一个对象数组,$ a,因为$ b是空的)。

但是当$ b中至少有一个对象时,$ diff会向我返回以下我不想要的内容。

{
  "1": {
    "id": "8",
    "attribute": "snapchat"
  },
  "2": {
    "id": "9",
    "attribute": "facebook"
  }
}

如何在结果中获取对象数组而不是上面的?为什么两个结果之间存在差异?感谢。

1 个答案:

答案 0 :(得分:5)

您只需在$diff = array_values($diff);之前使用json_encode,以便索引从零开始。

当您执行array_udiff时,$a的密钥会被保留,因此$diff的密钥从1开始而不是0.为了json_encode编码数组作为JSON数组而不是JSON对象,键必须是顺序的并从零开始。 array_values将重新索引数组,以便满足此条件。

为了清楚起见,即使其他项目已从数组中删除而不是从第一个项目中删除,因此索引仍以零开头,因为缺少键,您仍需要重新索引$diff。 / p>