取消设置 cakephp 生成的数组的元素

问题描述 投票:0回答:4

我有一个名为 $all_countries 的数组,遵循以下结构:

Array
(
    [0] => Array
        (
            [countries] => Array
                (
                    [id] => 1
                    [countryName] => Afghanistan
                )

        )

    [1] => Array
        (
            [countries] => Array
                (
                    [id] => 2
                    [countryName] => Andorra
                )

        )
)

我想循环访问一个名为 Barbarled_countries 的数组,并取消设置具有 CountryName 匹配的整个 [countries] 元素。

foreach($prohibited_countries as $country){
  //search the $all_countries array for the prohibited country and remove it...

}

基本上我已经尝试过使用 array_search() 但我无法理解它,而且我很确定我可以事先使用 Set::extract 或其他东西来简化这个数组?

如果有人能建议最好的方法,我将非常感激,谢谢。

php arrays cakephp
4个回答
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
投票

首先,id e 数组的格式为:

  Array(
    'Andorra' => 2,
    'Afghanistan' => 1
  );

或者如果您需要指定的密钥,那么我会这样做:

  Array(
    'Andorra' => array('countryName'=> 'Andorra', 'id'=>2),
    'Afghanistan' => array('countryName'=> 'Afghanistan', 'id'=>1)
  );

然后我就用

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
来完成此操作。


1
投票

尝试这样的方法(这可能不是最有效的方法,但应该有效):

for ($i = count($all_countries) - 1; $i >= 0; $i--) {
    if (in_array($all_countries[$i]['countries']['countryName'], $prohibited_countries) {
        unset($all_countries[$i]);
    }
}

1
投票

如果您想使用 CakePHP 中包含的 Set 类,您绝对可以使用 Set::combine( array(), key, value ) 来降低国家/地区数组的简单性。这将减少维度(但是,您也可以采取不同的方式。看起来您的国家/地区数组是由 Cake 模型创建的;如果您不希望多个国家/地区数组,您可以使用 Model::find( 'list' ) -维度结果数组...但是 YMMV).

无论如何,要解决你的核心问题,你应该使用 PHP 的内置 array_filter(...) 函数。手册页:https://www.php.net/manual/en/function.array-filter.php

迭代输入中的每个值 数组将它们传递给回调 功能。如果回调函数 返回 true,当前值来自 输入返回到结果中 大批。数组键被保留。

基本上,将您的国家/地区数组传递给它。定义一个回调函数,如果传递给回调的参数不在禁止国家列表中,则该函数将返回 true。

注意:array_filter 将迭代数组,并且比使用 for 循环要快得多(执行时间方面),因为 array_filter 是底层 C 函数的包装器。大多数时候,在 PHP 中,你可以找到一个内置的按摩数组来满足你的需要;使用它们通常是个好主意,因为速度会提升。

HTH, 特拉维斯

© www.soinside.com 2019 - 2024. All rights reserved.