php中的多个数组函数调用未按预期返回

时间:2013-10-08 10:16:18

标签: php arrays

  

注意:这是一个关于技术练习的问题。请专注于使用我需要的相同或相似的数组函数,而不是将代码分成更明显更易读但更长的代码段。

我正在尝试一起使用array_filter()array_walk()。我没有太多使用这些功能,所以我想在这个过程中了解它们。

  • 我有一系列可能的环境字符串('sandbox','live','dev')
  • 我有一个包含所选环境('dev')
  • 的字符串
  • 我使用glob()
  • 创建了一系列文件路径

我需要使用glob检索文件列表,包含两个环境之间差异的字符串。

我有以下起始变量:

$possible = array('dev', 'sandbox', 'live');
$env = array('dev');

显然两者之间存在差异:

$diff = array_diff($possible, $env); // array('sandbox', 'live')

我正在尝试执行glob()的目录包含以下内容:

array(
    0 => '/config/dev.yml',
    1 => '/config/sandbox.yml',
    2 => '/config/live.yml',
    3 => '/config/global.yml',
    4 => '/config/routes.yml',
    5 => '/config/security.yml'
);

我想使用数组函数调用来返回以下内容:

array(
    0 => '/config/dev.yml', // Because $env = 'dev'. Sandbox and live are removed
    1 => '/config/global.yml',
    2 => '/config/routes.yml',
    3 => '/config/security.yml
);

请注意sandbox.ymllive.yml已被移除。

以下是我正在使用的代码:

/** Loop through the list of yml files, placing $file into the local scope each time around, also import $possible, $env, $diff **/
$result = array_filter(glob(dirname(__DIR__) . '/config/*.yml'), function ($file) use ($possible, $env, $diff) {
    /** Loop around the diff (sandbox, live), placing them into $d each time around, also import $file again **/
    return array_walk($diff, function($d) use ($file) {
        /** Return when each environment (sandbox, live) is NOT in the $file string **/
        return !strstr($file, $d); 
    });
});

我的问题是:无论最内层的回复变为什么,都不会改变结果。我可以在那里返回真或假,它没有任何区别。我找回所有文件的列表,*包括一个包含字符串“sandbox.yml”和“live.yml”的文件,这不是我想要的。

我的逻辑错在哪里?

1 个答案:

答案 0 :(得分:1)

函数array_walk()会在成功时返回true,这几乎是每次调用它时都不会被过滤掉。您可以考虑使用简单的foreach

$result = array_filter($files, function ($file) use ($diff) {
    foreach ($diff as $env) {
        if (strstr($file, $env) !== false) {
            return false;
        }
    }
    return true;
});

或者,如你自己所说:

$result = array_filter($files, function ($file) use ($diff) {
    return !in_array(basename($file, '.yml'), $diff);
});