【问题标题】:Issue in searching from associative array on the basis of particular field基于特定字段从关联数组中搜索的问题
【发布时间】:2019-04-25 22:31:46
【问题描述】:

我在下面写了几行代码来获取旅馆特定房间的床位数

 $RoomsArray = array_column($RoomsDetails->jsonSerialize(), 'NumberOfBeds');
 $FoundNumberOfBeds = array_search('f2937f76-05d0-9725-06fc-37cf061a31c6', $RoomsArray);
 $json_string = json_encode($RoomsDetails->jsonSerialize(), JSON_PRETTY_PRINT);
 var_dump($FoundNumberOfBeds);

显示bool(false)

期望的输出应该是 2

$RoomsDetails->jsonSerialize() 包含如下数据:

[ {“RoomId”:“f2937f76-05d0-9725-06fc-37cf061a31c6”,“FloorNumber”:“1”,“RoomNumber”:“101”,“RoomPrefix”:“A101”, “房间类型”:{“$oid”:“5b44ca27bb2c563ea4006395”},“NumberOfBeds”: “2”,“可用”:0,“BayId”:{“$oid”:“5be1d5fbbb2c561bb4007837”} }, { "RoomId": "103d89d3-bcdd-351f-6c3c-3b81575b78d2", "FloorNumber": “2”,“房间号”:“01”,“房间前缀”:“B201”,“房间类型”:{“$oid”: “5b44ca2ebb2c563ea4006396”},“NumberOfBeds”:“3”,“可用”:“3”, “BayId”:{“$oid”:“5be1d5fbbb2c561bb4007838”}},{“RoomId”: “5677c541-a0b3-fb74-493b-820549c48997”,“楼层”:“2”, “房间号”:“201”,“房间创建”:“手动”,“房间类型”:{“$oid”: “5b44ca27bb2c563ea4006395”},“NumberOfBeds”:“6”,“可用”:“6”, “BayId”:{“$oid”:“5be1d5fbbb2c561bb4007838”}},{“RoomId”: “1bcf9a01-ca34-5b28-388f-cab05687ff1d”,“楼层数”:“1”, “房间号”:“103”,“房间创建”:“手动”,“房间类型”:{“$oid”: “5b44ca27bb2c563ea4006395”},“NumberOfBeds”:“7”,“可用”:“7”, “BayId”:{“$oid”:“5be1d5fbbb2c561bb4007837”}},{“RoomId”: “5e5d51fd-16e7-4844-2965-98d6afe2d7b4”,“楼层数”:“1”, “房间号”:“105”,“房间创建”:“手动”,“房间类型”:{“$oid”: “5b44ca27bb2c563ea4006395”},“NumberOfBeds”:“6”,“可用”:4, “BayId”:{“$oid”:“5be1d5fbbb2c561bb4007837”}},{“RoomId”: “35cd9b4c-15a4-53fd-ba8d-6096883dd1c4”,“楼层数”:“1”, “RoomNumber”:“106”,“RoomCreation”:“手动”,“RoomType”:{“$oid”: “5b44ca27bb2c563ea4006395”},“NumberOfBeds”:“5”,“可用”:“5”, “BayId”:{“$oid”:“5be1d5fbbb2c561bb4007837”}},{“RoomId”: “cfb4913d-ea28-e52e-94db-36f72601650e”,“楼层数”:“1”, “房间号”:“104”,“房间创建”:“手动”,“房间类型”:{“$oid”: “5b44ca27bb2c563ea4006395”},“NumberOfBeds”:“6”,“可用”:“6”, “BayId”:{“$oid”:“5be1d5fbbb2c561bb4007837”}},{“RoomId”: “64d729fc-fbd5-5834-7820-be467af719f0”,“楼层数”:“1”, “RoomNumber”:“102”,“RoomCreation”:“手动”,“RoomType”:{“$oid”: “5b44ca2ebb2c563ea4006396”},“NumberOfBeds”:“7”,“可用”:“7”, “BayId”:{“$oid”:“5be1d5fbbb2c561bb4007837”}}]

【问题讨论】:

  • 您对array_column 的使用不会以您期望的方式工作。它将返回一个数组,其中包含一个以NumberOfBeds 为值的数字键(即[0] = "2", [1] = "3"

标签: php php-5.6 php-5.5


【解决方案1】:

您的代码存在一些问题。

首先,您错误地使用了array_column。按照您使用它的方式,您将返回一个以数字索引作为键、房间数作为值的数组。此外,您已将对象序列化为 JSON 作为参数。这不是必需的 - 对象已经处于与 array_column 一起使用的正确状态。

正确的使用方法是这样的:

$RoomsArray = array_column($RoomsDetails, 'NumberOfBeds', 'RoomId');

请注意,'RoomId' 告诉 array_column 使用此列作为键值,并且对象没有被序列化为 JSON。

其次,您使用array_search 在数组中查找值。这是不正确的。通过使用array_search,您正在寻找您提供的相应值的密钥。实际上,您想要的是返回您已经拥有的键的值(房间 ID),如下所示:

$FoundNumberOfBeds = $RoomsArray['f2937f76-05d0-9725-06fc-37cf061a31c6'];

通过删除未使用的行并修改错误,我最终得到以下正确返回指定RoomId 的房间数:

$s = '[ { "RoomId": "f2937f76-05d0-9725-06fc-37cf061a31c6", "FloorNumber": "1", "RoomNumber": "101", "RoomPrefix": "A101", "RoomType": { "$oid": "5b44ca27bb2c563ea4006395" }, "NumberOfBeds": "2", "Available": 0, "BayId": { "$oid": "5be1d5fbbb2c561bb4007837" } } ]';
$RoomsDetails = json_decode($s);

$RoomsArray = array_column($RoomsDetails, 'NumberOfBeds', 'RoomId');
$FoundNumberOfBeds = $RoomsArray['f2937f76-05d0-9725-06fc-37cf061a31c6'];
var_dump($FoundNumberOfBeds);

请注意,在我的示例中,我删除了除一个房间条目之外的所有条目。您当然会从代码中删除 $s$RoomsDetails

【讨论】:

  • 呃,我两次误解了这个问题。这是正确的答案。 :)
  • 警告:json_decode() 期望参数 1 为字符串,给定数组 ' 警告:array_column() 期望参数 1 为数组,给定 i 为空
  • @NidaAmin 这是因为 Martin 在此示例中使用了 JSON 字符串。你不需要解码它,因为你从jsonSerialize得到一个数组。
  • 您真的应该开始尝试了解您在做什么,并停止从 SO 复制和粘贴代码。
  • 现在它在删除 json_decode 后抛出 Undefined index: f2937f76-05d0-9725-06fc-37cf061a31c6
猜你喜欢
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 2019-11-30
  • 2017-07-18
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多