我有一个名为$ all_countries的数组,遵循以下结构:
Array
(
[0] => Array
(
[countries] => Array
(
[id] => 1
[countryName] => Afghanistan
)
)
[1] => Array
(
[countries] => Array
(
[id] => 2
[countryName] => Andorra
)
)
)
我想遍历一个名为prohibited_countries的数组,并取消设置countryName匹配的整个[countries]元素。
foreach($prohibited_countries as $country){
//search the $all_countries array for the prohibited country and remove it...
}
基本上我已经尝试过使用array_search()但是我无法理解它,我很确定我可以事先使用Set :: extract或其他东西来简化这个数组吗?
如果有人能提出最好的方法,我真的很感激,谢谢。
答案 0 :(得分:2)
以下是使用array_filter的示例:
$all_countries = ...
$prohibited_countries = array('USA', 'England'); // As an example
$new_countries = array_filter($all_countries, create_function('$record', 'global $prohibited_countries; return !in_array($record["countries"]["countryName"], $prohibited_countries);'));
$ new_countries现在包含已过滤的数组
答案 1 :(得分:1)
首先是格式的数据:
Array(
'Andorra' => 2,
'Afghanistan' => 1
);
或者如果您需要拥有命名密钥,那么我会这样做:
Array(
'Andorra' => array('countryName'=> 'Andorra', 'id'=>2),
'Afghanistan' => array('countryName'=> 'Afghanistan', 'id'=>1)
);
然后我会jsut使用array_diff_keys
:
// assuming the restricted and full list are in the same
// array format as outlined above:
$allowedCountries = array_diff_keys($allCountries, $restrictedCountries);
如果您的受限制国家/地区只是一系列名称或ID,那么您可以根据需要使用array_flip
,array_keys
和/或array_fill
来获取值作为array_diff_keys
操作。
您也可以使用array_map
来执行此操作。
答案 2 :(得分:1)
尝试这样的事情(它可能不是最有效的方式,但它应该有效):
for ($i = count($all_countries) - 1; $i >= 0; $i--) {
if (in_array($all_countries[$i]['countries']['countryName'], $prohibited_countries) {
unset($all_countries[$i]);
}
}
答案 3 :(得分:1)
如果你想使用CakePHP中包含的Set类,你肯定可以使用Set :: combine(array(),key,value)来降低国家数组的简单性。这将减少维度(但是,您也可以这样做。看起来您的国家/地区阵列是由Cake模型创建的;如果您不想要多个,可以使用Model :: find('list') -dimension结果数组...但YMMV)。
无论如何,要解决您的核心问题,您应该使用PHP的内置array_filter(...)函数。手册页:http://us3.php.net/manual/en/function.array-filter.php
迭代输入中的每个值 数组将它们传递给回调 功能。如果是回调函数 返回true,来自的当前值 输入返回到结果中 阵列。数组键被保留。
基本上,传递你的国家阵列。定义一个回调函数,如果传递给回调的参数不在禁止国家列表中,则返回true。
注意:array_filter将迭代你的数组,并且比使用for循环要快得多(执行时间),因为array_filter是底层C函数的包装器。大部分时间在PHP中,您可以找到内置的按摩阵列,满足您的需求;使用它们通常是一个好主意,只是因为提速。
HTH, 特拉维斯