在基于特定字段的关联数组中进行搜索时遇到的问题

时间:2018-11-23 10:05:02

标签: php php-5.6 php-5.5

我已经在下面几行代码中写到,以获取旅馆特定房间的床位数

 $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”,   “ RoomType”:{“ $ oid”:“ 5b44ca27bb2c563ea4006395”},“ NumberOfBeds”:   “ 2”,“可用”:0,“ BayId”:{“ $ oid”:“ 5be1d5fbbb2c561bb4007837”}   },{“ RoomId”:“ 103d89d3-bcdd-351f-6c3c-3b81575b78d2”,“ FloorNumber”:   “ 2”,“ RoomNumber”:“ 01”,“ RoomPrefix”:“ B201”,“ RoomType”:{“ $ oid”:   “ 5b44ca2ebb2c563ea4006396”},“ NumberOfBeds”:“ 3”,“ Available”:“ 3”,   “ BayId”:{“ $ oid”:“ 5be1d5fbbb2c561bb4007838”}},{“ RoomId”:   “ 5677c541-a0b3-fb74-493b-820549c48997”,“ FloorNumber”:“ 2”,   “ RoomNumber”:“ 201”,“ RoomCreation”:“ Manual”,“ RoomType”:{“ $ oid”:   “ 5b44ca27bb2c563ea4006395”},“ NumberOfBeds”:“ 6”,“ Available”:“ 6”,   “ BayId”:{“ $ oid”:“ 5be1d5fbbb2c561bb4007838”}},{“ RoomId”:   “ 1bcf9a01-ca34-5b28-388f-cab05687ff1d”,“ FloorNumber”:“ 1”,   “ RoomNumber”:“ 103”,“ RoomCreation”:“ Manual”,“ RoomType”:{“ $ oid”:   “ 5b44ca27bb2c563ea4006395”},“ NumberOfBeds”:“ 7”,“ Available”:“ 7”,   “ BayId”:{“ $ oid”:“ 5be1d5fbbb2c561bb4007837”}},{“ RoomId”:   “ 5e5d51fd-16e7-4844-2965-98d6afe2d7b4”,“ FloorNumber”:“ 1”,   “ RoomNumber”:“ 105”,“ RoomCreation”:“ Manual”,“ RoomType”:{“ $ oid”:   “ 5b44ca27bb2c563ea4006395”},“ NumberOfBeds”:“ 6”,“ Available”:4,   “ BayId”:{“ $ oid”:“ 5be1d5fbbb2c561bb4007837”}},{“ RoomId”:   “ 35cd9b4c-15a4-53fd-ba8d-6096883dd1c4”,“ FloorNumber”:“ 1”,   “ RoomNumber”:“ 106”,“ RoomCreation”:“ Manual”,“ RoomType”:{“ $ oid”:   “ 5b44ca27bb2c563ea4006395”},“ NumberOfBeds”:“ 5”,“ Available”:“ 5”,   “ BayId”:{“ $ oid”:“ 5be1d5fbbb2c561bb4007837”}},{“ RoomId”:   “ cfb4913d-ea28-e52e-94db-36f72601650e”,“ FloorNumber”:“ 1”,   “ RoomNumber”:“ 104”,“ RoomCreation”:“ Manual”,“ RoomType”:{“ $ oid”:   “ 5b44ca27bb2c563ea4006395”},“ NumberOfBeds”:“ 6”,“ Available”:“ 6”,   “ BayId”:{“ $ oid”:“ 5be1d5fbbb2c561bb4007837”}},{“ RoomId”:   “ 64d729fc-fbd5-5834-7820-be467af719f0”,“ FloorNumber”:“ 1”,   “ RoomNumber”:“ 102”,“ RoomCreation”:“ Manual”,“ RoomType”:{“ $ oid”:   “ 5b44ca2ebb2c563ea4006396”},“ NumberOfBeds”:“ 7”,“ Available”:“ 7”,   “ BayId”:{“ $ oid”:“ 5be1d5fbbb2c561bb4007837”}}]

1 个答案:

答案 0 :(得分:2)

这里的代码有几个问题。

首先,您没有正确使用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