如何使用$ _GET中的一组条件过滤数组中的数据

时间:2018-03-16 16:01:04

标签: php

我在过滤数组时遇到问题。

我在URL中传递了一组功能,我希望匹配具有所有指定功能的数组中的项目。一旦我从URL中删除参数,代码就会崩溃,因为我正在使用$_GET进行过滤。我已经开始创建一个用于调试目的的数组。我还在代码中提供了get参数作为注释。有人可以帮帮我吗?请随意将代码复制到IDE中。

以下是我的代码:

<?php 
error_reporting(E_ALL & ~E_NOTICE);

//  Created a static array for you guys for debugging 
//  page.php?pool=1&beach=1&concierge=1   put this url path at the end of the url so you can get the data im seeing
$htls=array(
    array("HotelName"=>"M Beach Hotel","minprice"=>264,"CountryCode"=>"US",'feature'=>array("type"=>"hotel","pool"=>1,"beach"=>1,'concierge'=>0)), array("HotelName"=>"Hilton","minprice"=>73,"CountryCode"=>"US",'feature'=>array("type"=>"hotel","pool"=>1,"beach"=>0,'concierge'=>1)),
    array("HotelName"=>"Fontainebleau","minprice"=>375,"CountryCode"=>"US",'feature'=>array("type"=>"resort","pool"=>1,"beach"=>1,'concierge'=>1)),
    array("HotelName"=>"Woodlow Inn","minprice"=>40,"CountryCode"=>"US",'feature'=>array("type"=>"inn","pool"=>0,"beach"=>0,'concierge'=>0)),
    array("HotelName"=>"El cabanna","minprice"=>73,"CountryCode"=>"US",'feature'=>array("type"=>"resort","pool"=>1,"beach"=>1,'concierge'=>1)),
    array("HotelName"=>"James south beach","minprice"=>73,"CountryCode"=>"US",'feature'=>array("type"=>"hotel","pool"=>0,"beach"=>1,'concierge'=>0)),
);

foreach($htls as $key1 => $val ){

    foreach($val['feature'] as $key => $val2){   

        //   Here's where I start to get lost soon as a parameter is not in the url for example ?pool=1 the code falls apart.
        if ($_GET['pool']==1 && $val['feature']['pool']==1  and  $_GET['beach']==1 && $val['feature']['beach']==1 and  $_GET['concierge']==1 && $val['feature']['concierge']==1) 
        {
            echo $key.'- '.$val2.' - '.$val['feature']['pool'].' - '.$val['HotelName'].'<br>';         

        }   
        break;  
    }
}
?>

1 个答案:

答案 0 :(得分:2)

如果您尝试匹配酒店阵列中具有查询字符串中包含的所有功能集的项目,则可以使用array_diff_assoc过滤您的数组,以比较{中的要素数组{1}}具有酒店记录的一系列功能。

$_GET

array_diff_assoc将返回$filtered = array_filter($htls, function($hotel) { return !array_diff_assoc($_GET, $hotel['feature']); }); 中未包含在$_GET中的任何键/值对的数组。如果$hotel['feature']!,则true对其进行否定,因此如果回调为空,则回复将返回false,如果不是,则回复$filtered

这只是过滤。在他们进行过滤后,您可以迭代$_GET并根据需要输出它们。

如果除了$_GET['filters']中的过滤器之外还有其他参数,您可以使用数组格式重命名过滤器控件以将它们组合在一起,这样您就可以引用$_GET而不仅仅<input type="checkbox" name="filters[pool]" value="1"> }。我猜这些值可能来自复选框,所以它会是这样的:

public native void SetDouble(double d);

implicitly cast it to boolean