如果信息存在于两个数组中的一个数组中,如何不显示信息


How to not display information if it exists in one of two arrays

情况是我有两个数组通过API收集JSON数据:

$players  = getAPI("http://xx.xxx.xxx.xx:xxxxx/players.json?apiKey=xxxxxxxxxxxxxxxxxxxxxxxx");
$recents  = getAPI("xx.xxx.xxx.xx:xxxxx/recent.json?apiKey=xxxxxxxxxxxxxxxxxxxxxxxx");

方法是获取内容并将JSON解码为数组。对于玩家阵列,我们在一个阵列中有以下数据:

$players

[
  {
    "id": "76561198033377272",
    "name": "PitMonk",
    "position": {
      "x": -339,
      "y": 26,
      "z": 191
    },
    "rotation": 128,
    "time": 418310,
    "ip": "",
    "inventory": {
      "main": [],
      "belt": [
        {
          "name": "rock",
          "amount": 1,
          "blueprint": false,
          "condition": 100
        },
        {
          "name": "torch",
          "amount": 1,
          "blueprint": false,
          "condition": 100
        }
      ],
      "wear": []
    }
  },
  {
    "id": "76561198088638439",
    "name": "Pippa",
    "position": {
      "x": -337,
      "y": 25,
      "z": 177
    },
    "rotation": 73,
    "time": 419136,
    "ip": "",
    "inventory": {
      "main": [
        {
          "name": "arrow.wooden",
          "amount": 12,
          "blueprint": false
        },
        {
          "name": "bow.hunting",
          "amount": 1,
          "blueprint": false,
          "condition": 93
        },
        {
          "name": "blueprint_fragment",
          "amount": 25,
          "blueprint": false
        },
        {
          "name": "metal.fragments",
          "amount": 1366,
          "blueprint": false
        },
        {
          "name": "metal.refined",
          "amount": 48,
          "blueprint": false
        },
        {
          "name": "charcoal",
          "amount": 1120,
          "blueprint": false
        },
        {
          "name": "lowgradefuel",
          "amount": 738,
          "blueprint": false
        }
      ],
      "belt": [
        {
          "name": "rock",
          "amount": 1,
          "blueprint": false,
          "condition": 100
        },
        {
          "name": "torch",
          "amount": 1,
          "blueprint": false,
          "condition": 100
        },
        {
          "name": "pickaxe",
          "amount": 1,
          "blueprint": false,
          "condition": 76
        },
        {
          "name": "pickaxe",
          "amount": 1,
          "blueprint": false,
          "condition": 17
        },
        {
          "name": "pickaxe",
          "amount": 1,
          "blueprint": false,
          "condition": 100
        },
        {
          "name": "pickaxe",
          "amount": 1,
          "blueprint": false,
          "condition": 100
        }
      ],
      "wear": [
        {
          "name": "burlap.shirt",
          "amount": 1,
          "blueprint": false
        },
        {
          "name": "attire.hide.skirt",
          "amount": 1,
          "blueprint": false
        }
      ]
    }
  }
]

$recents

[
  {
    "id": "76561198039206786",
    "name": "JakeGroves"
  },
  {
    "id": "76561198088638439",
    "name": "Pippa"
  },
  {
    "id": "76561198033377272",
    "name": "PitMonk"
  },
  {
    "id": "76561198146864439",
    "name": "YepWellDone"
  },
  {
    "id": "76561198164836207",
    "name": "Baz"
  },
  {
    "id": "76561198076406281",
    "name": "xwalnutx"
  },
  {
    "id": "76561197985716090",
    "name": "Darkflame134"
  },
  {
    "id": "76561198263423842",
    "name": "XitaikiznerX"
  },
  {
    "id": "76561198129952244",
    "name": "NatanGamer"
  },
  {
    "id": "76561198071842055",
    "name": "Baha Bey"
  }
]

正如你所看到的,玩家是连接的人,最近的是最近连接的人的总列表。

我尝试过:

 foreach ($players as $player) {
       echo $players->name;
    }
    echo "</br></br>";
    foreach ($recent as $rec) {
      if ($rec->name != $player->name) {
       echo $rec->name . "</br>";
     }
    }

它产生的结果是:

PitMonk Pippa
JakeGroves
PitMonk
YepWellDone
Baz
xwalnutx
Darkflame134
XitaikiznerX
NatanGamer
Baha Bey

所以它只是忽略了"pippa",我不确定是否可以像这样与两个数组交互以获得唯一值?

您有兴趣列出$users中不存在于$players$recents中的所有名称,对吗?

假设你只对这个名字感兴趣:

// First, let's get a new array with all names from both arrays (can contain dups)
$pcNames = array_map($players + $recents, function($playerObject) {
    return $playerObject->name;
});
// Next, let's remove all dups
$pcNames = array_unique($pcNames);
// === At this point you have an array with all names from `$players` and `$recents` ===
// === You may do something else with those, but I'll now create another array with  ===
// === all users not in the players/recents lists.                                   ===
// Now let's also get a list of names of users in the `$users` variable
$userNames = array_map($users, function($playerObject) {
    return $playerObject->name;
});
// And finally let's get all names which are not in players or recents
$diffNames = array_diff($userNames, $pcNames);
// Let's output those to see whether it worked
var_dump($diffNames);

当然,根据您的用例,还有其他方法。例如,我们可以提取所有三个数组的名称,然后只使用带有3个参数的array_diff(但您没有$pcArray的副产品),或者如果您真的想比较ID但打印名称,我们必须更改所有内联函数以提取ID而不是名称,并进一步向下引用用户数组以获得实际名称,等等。