我正在尝试使用array_filter来过滤某些值,并禁止其余值。我之前从未使用过array_filter,所以我一直在努力试图包围我的标题。
我是否需要在循环之前先过滤这些值,如果是这样,我将如何过滤数组以仅查找这些值。
这是我正在使用的片段,它正在回击错误。 $ alerts是我只需要从数组返回的值,而不允许其余的值。然后我循环遍历过滤结果。在我看来,这似乎是合乎逻辑的,但我确信我错过了一些因为它不起作用的东西。
$data = file_get_contents($url); // put the contents of the file into a variable
$results = json_decode($data, true); // decode the JSON feed
$alerts = array(Tornado Warning, Severe Thunderstorm Warning, Flash Flood Warning, Flood Warning);
$selected_events = array_filter($results['features'], function($data) {
return $data === $alerts;
});
//Lets loop through the array
foreach($selected_events as $currFeature)
{
$event = $currFeature['properties']['event'];
$wfo = $currFeature['properties']['sender'];
$area = $currFeature['properties']['areaDesc'];
$expires = $currFeature['properties']['expires'];
以下是我正在使用的JSON示例。
{
"@context": [
"https://raw.githubusercontent.com/geojson/geojson-ld/master/contexts/geojson-base.jsonld",
{
"wx": "https://api.weather.gov/ontology#",
"@vocab": "https://api.weather.gov/ontology#"
}
],
"type": "FeatureCollection",
"features": [
{
"id": "https://api.weather.gov/alerts/NWS-IDP-PROD-2485744-2320592",
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-96.77,
33.84
],
[
-96.76,
33.82
],
[
-96.71,
33.83
],
[
-96.52,
33.82
],
[
-96.5,
33.77
],
[
-96.43,
33.78
],
[
-96.38,
33.73
],
[
-96.39,
33.45
],
[
-96.42,
33.46
],
[
-96.94,
33.54
],
[
-96.94,
33.85
],
[
-96.77,
33.84
]
]
]
},
"properties": {
"@id": "https://api.weather.gov/alerts/NWS-IDP-PROD-2485744-2320592",
"@type": "wx:Alert",
"id": "NWS-IDP-PROD-2485744-2320592",
"areaDesc": "Grayson",
"geocode": {
"UGC": [
"TXC181"
],
"SAME": [
"048181"
]
},
"references": [],
"sent": "2017-08-13T13:18:17+00:00",
"effective": "2017-08-13T13:18:17+00:00",
"onset": "2017-08-13T13:18:00+00:00",
"expires": "2017-08-13T16:15:00+00:00",
"ends": "2017-08-13T16:15:00+00:00",
"status": "Actual",
"messageType": "Alert",
"category": "Met",
"severity": "Severe",
"certainty": "Likely",
"urgency": "Expected",
"event": "Flood Warning",
"sender": "NWS Fort Worth TX",
"headline": "Flood Warning issued August 13 at 8:18AM CDT expiring August 13 at 11:15AM CDT by NWS Fort Worth TX",
"description": "The National Weather Service in Fort Worth has issued a\n\n* Flood Warning for...\nGrayson County in north central Texas...\n\n* Until 1115 AM CDT\n\n* At 816 AM CDT, Emergency management reported flooding of several\nroadways across Grayson County. While the heaviest rainfall has\nended...excessive runoff will continue to result in\nstreams...creeks and some rivers exceeding their banks across the\narea.\n\n* Some locations that will experience flooding include...\nSherman, Denison, Whitesboro, Howe, Pottsboro, Collinsville,\nWhitewright, Bells, Tom Bean, Knollwood, Dorchester, Eisenhower\nState Park, southeastern Lake Texoma, Southmayd, Sadler and Luella.",
"instruction": "A Flood Warning means that flooding is imminent or occurring. Water\nrises will generally be gradual, but flooding of some low water\ncrossings and other low-lying areas near rivers, creeks, and streams\nis expected.",
"response": "Avoid",
"parameters": {
"VTEC": [
"/O.NEW.KFWD.FA.W.0008.170813T1318Z-170813T1615Z/"
],
"EAS-ORG": [
"WXR"
],
"PIL": [
"FWDFLWFWD"
],
"BLOCKCHANNEL": [
"CMAS",
"EAS",
"NWEM"
],
"eventEndingTime": [
"2017-08-13T16:15:00Z"
]
}
}
},
答案 0 :(得分:-1)
$alerts
数组的定义目前形式不正确。您应该将可能的值括在"
或'
中,请参阅下面的解决方案。
您可以执行以下操作:
$o=json_decode($str,true); // $str is the JSON string
$features=$o['features'];
$filtered= array_filter($features,function($el){
$alerts = array('Tornado Warning', 'Severe Thunderstorm Warning', 'Flash Flood Warning', 'Flood Warning');
return in_array($el['properties']['event'],$alerts);});
json_encode(...,true)
将生成一个关联数组(而不是一个对象)。然后,过滤器函数检查数组['properties']['event']
中元素的可能$features
属性。只有那些在$alerts
数组中找到值的人(我正在使用in_array()
)才会通过过滤过程。
如果您愿意,还可以在实际过滤器函数之外定义$alerts
数组,并仅在那里引用它:
..
...
$alerts = array('Tornado Warning', 'Severe Thunderstorm Warning',
'Flash Flood Warning', 'Flood Warning');
$filtered= array_filter($features,function($el) use ($alerts) {
return in_array($el['properties']['event'],$alerts);});
您可以在此处找到有效的演示:http://rextester.com/EELE62798