我有这个巨大的阵列:
array(47) (
"name" => string(0) ""
"state" => string(7) "Alabama"
"city" => string(0) ""
"country" => string(13) "United States"
"location" => string(0) ""
"rooms" => string(0) ""
"price" => string(0) ""
"highlights" => array(5) (
0 => string(0) ""
1 => string(0) ""
2 => string(0) ""
3 => string(0) ""
4 => string(0) ""
)
"specifications_type" => string(0) ""
"specifications_lotsize" => string(0) ""
"specifications_apn" => string(0) ""
"specifications_interest" => string(0) ""
"specifications_year" => string(0) ""
"specifications_buildings" => string(0) ""
"specifications_stories" => string(0) ""
"specifications_corridors" => string(0) ""
"financials_room" => string(0) ""
"financials_other" => string(0) ""
"financials_total" => string(0) ""
"financials_multiplier" => string(0) ""
"financials_caprate" => string(0) ""
"financials_netincome" => string(0) ""
"amenities_pool" => string(0) ""
"amenities_fitness" => string(0) ""
"amenities_quarters" => string(0) ""
"amenities_services" => string(0) ""
"amenities_spa" => string(0) ""
"amenities_meetspace" => string(0) ""
"amenities_parkspace" => string(0) ""
"amenities_others" => string(0) ""
"facilities_room" => string(0) ""
"facilities_hvac" => string(0) ""
"facilities_furnitures" => string(0) ""
"facilities_tv" => string(0) ""
"facilities_ref" => string(0) ""
"facilities_microwave" => string(0) ""
"consumables_resto" => string(0) ""
"consumables_restocpct" => string(0) ""
"consumables_barlounge" => string(0) ""
"consumables_barloungecpct" => string(0) ""
"consumables_bevrevenue" => string(0) ""
"consumables_others" => string(0) ""
"specifications" => string(100) "{"type":"","lotsize":"","apn":"","interest":"","year":"","buildings":"","stories":"","corridors":""}"
"consumables" => string(89) "{"resto":"","restocpct":"","barlounge":"","barloungecpct":"","bevrevenue":"","others":""}"
"amenities" => string(100) "{"type":"","lotsize":"","apn":"","interest":"","year":"","buildings":"","stories":"","corridors":""}"
"facilities" => string(100) "{"type":"","lotsize":"","apn":"","interest":"","year":"","buildings":"","stories":"","corridors":""}"
"financials" => string(100) "{"type":"","lotsize":"","apn":"","interest":"","year":"","buildings":"","stories":"","corridors":""}"
)
我想删除其键以下列任何一项开头的元素: “specifications_”,“amenities_”,“facilities_”,“consumables_”,“财务_”
我曾想过将array_filter与回调一起使用,但我不知道如何在回调中做事。请帮忙。
答案 0 :(得分:5)
您实际上无法使用array_filter()
,因为它会保留密钥,但您无法过滤密钥,这是您的问题。在这种情况下,你也可以循环。
$prefix = array(
'specifications_',
'amenities_',
'facilities_',
'consumables_',
'financials_',
);
$output = array();
foreach ($input as $k => $v) {
foreach ($prefix as $p) {
$add = true;
if (strpos($k, $p) === 0) {
$add = false;
break;
}
}
if ($add) {
$output[$k] = $v;
}
}
现在只要前缀列表不那么大且数组不是那么大,但是除非你需要它,否则不需要使解决方案过于复杂。
答案 1 :(得分:2)
array_filter()
仅传递值,因此不适合此任务。使用foreach()
遍历数组,将要保留的元素添加到新数组中。
答案 2 :(得分:1)
<?php
$source_array = array([..the yours array..]);
$temp_array = array();
$exclude_keys = array('specifications', 'amenities', 'facilities', 'consumables', 'financials');
foreach ($source_array as $key => $value) {
if (!in_array(substr($key, 0, strpos('_') - 1), $exclude_keys)) {
$temp_array[$key] = $value;
}
}
答案 3 :(得分:0)
array_walk
怎么办?
$prefix = array(
'specifications_',
'amenities_',
'facilities_',
'consumables_',
'financials_',
);
function filter($v, $k, &$data) {
global $prefix;
foreach($prefix as $p) {
if(strpos($v, $p) === 0) {
unset($data[$v])
break;
}
}
}
array_walk(array_keys($array), 'filter', &$array);
请注意,我遍历数组的键。这是因为不允许更改用于array_walk
的数组(或者至少会导致不可预测的行为)。
如果要保持原始数组的完整性,则必须先复制它:
$array_copy = $array;
array_walk(array_keys($array), 'filter', &$array_copy);