0

注:これは技術的な演習に関する質問です。コードを明らかに読みやすいが長いコード セグメントに分割するのではなく、私が必要とする同じまたは類似の配列関数を利用することに集中してください。

と を一緒に使おうとしてarray_filter()array_walk()ます。私はこれらの機能をあまり使用していないので、その過程でそれらについて学びたいと思います。

  • 可能な環境文字列の配列があります (「sandbox」、「live」、「dev」)
  • 選択した環境 ('dev') を含む文字列があります
  • を使用してファイルパスの配列がありますglob()

glob を使用して、2 つの環境の違いによる文字列を含まないファイルのリストを取得する必要があります。

次の開始変数があります。

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

そして明らかに2つの違い:

$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.ymlおよびlive.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); 
    });
});

私の問題は次のとおりです。最も内側の戻り値が何に変更されても、結果は変更されません。そこで true または false を返すことができますが、違いはありません。すべてのファイルのリストが返されます。これには、"sandbox.yml" と "live.yml" という文字列が含まれているものも含まれますが、これは私が望んでいるものではありません。

私の論理はどこで間違っていますか?

4

1 に答える 1