未设置的cakephp元素生成的数组

时间:2009-12-08 14:51:16

标签: arrays cakephp

我有一个名为$ 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或其他东西来简化这个数组吗?

如果有人能提出最好的方法,我真的很感激,谢谢。

4 个答案:

答案 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_fliparray_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, 特拉维斯