array_udiff返回不同的结果

Raf*_*fff 2 php arrays json

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

$diff = array_udiff($a, $b,
    function($obj_a, $obj_b) {
        return $obj_a->id - $obj_b->id;
    }
);
Run Code Online (Sandbox Code Playgroud)

$ a是

[
  {
    "id": "7",
    "attribute": "instagram"
  },
  {
    "id": "8",
    "attribute": "snapchat"
  },
  {
    "id": "9",
    "attribute": "facebook"
  }
]
Run Code Online (Sandbox Code Playgroud)

$ b是

[
  {
    "id": "7",
    "attribute": "instagram",
    "value": "somevalue"
  }
]
Run Code Online (Sandbox Code Playgroud)

$ diff应该返回对象数组

[
  {
    "id": "8",
    "attribute": "snapchat"
  },
  {
    "id": "9",
    "attribute": "facebook"
  }
]
Run Code Online (Sandbox Code Playgroud)

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

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

{
  "1": {
    "id": "8",
    "attribute": "snapchat"
  },
  "2": {
    "id": "9",
    "attribute": "facebook"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Don*_*nic 5

您只需要在使用$diff = array_values($diff);之前使用json_encode索引将从零开始.

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

需要明确的是,即使其他项目已从数组中删除而不是从第一个项目中删除,因此索引仍然以零开始,$diff因为缺少键,您仍需要重新索引.