从包含特定字符串的数组创建数组


create arrays from array containg specific strings

我有一个从scandir((创建的desc数组。下面是数组的一个小示例:

[7] => 20151227NY [8] => 20151226NY [9] => 20151221NY [10] => 20151125CT [11] => 20140313NY [12] => 20140228NY [13] => 20140227NY [14] => 20140226NH [15] => 20140226CT [16] => 20140128NJ [17] => 20140123NY [18] => 20140122CT [19] => 20140121NJ [20] => 20140102NY [21] => 20131231NJ 

这些都是使用 YearMonthDateState 命名的文件夹。我需要一种方法来获取所有包含"NY"、"CT"、"NJ"、"NH"的文件夹,并将它们放在按 desc 顺序排序的单独数组中(最新日期在前(。这样我就可以根据最新日期(在文件夹名称中(获取所需的文件。我试过这个:

//GET WEEKLY FOLDER
$weekly_dir = "../email/weekly/";
$weekly_files = scandir($weekly_dir, $sorting_order = 1);
$weekly_index =  $weekly_files[7];
$weekly_state = substr($weekly_index, 8,2);
$new_weekly = str_replace($weekly_state, $template->State, $weekly_index);
echo $new_weekly;

但不幸的是,并非每个新的"每周"都在同一天上传。所以我不能只在最后切换状态字符串("NY"NH"等(。有什么想法吗?

**

更新:**我已经按照迈克尔的建议添加/修改了代码,所以我的代码现在看起来像这样:

$weekly_dir = "../email/weekly/";
$weekly_file_array = scandir($weekly_dir, $sorting_order = 1);
$index = $weekly_file_array;
// Prepare result
$weeklies = array_fill_keys(array_map(function ($item) {
if (substr($item, -2) == 'NY'){
    return substr($item, -2);
}
}, $index),$item);
// Split into state arrays
array_walk($index, function ($item) use (&$weeklies) {
    $state = substr($item, -2);
    $weeklies[$state][] = $item;
});
$weeklies_latest = array_combine(array_keys($weeklies), array_map(function ($item) {
    sort($item);
    return array_pop($item);
 }, $weeklies));

似乎工作正常,但我在页面顶部收到这两个错误:"警告:sort(( 期望参数 1 是数组,给定空值"警告:array_pop(( 期望参数 1 是数组,给定空值"。我像这样调用 $weeklies_latest 数组:

<a href="/COMM/email/weekly/<? echo $weeklies_latest[$template->State] ?>/weekly.html" class="button-link button-link-blue">CURRENT ISSUE</a>

我通常分两步完成,因为它使代码更具可读性。

首先,我根据状态准备结果,使用array_fill_keysarray_map

的组合
// Prepare result
$weeklies = array_fill_keys(array_map(function ($item) {
    return substr($item, -2);
}, $input), []);

这将构建一个数组,其中状态作为指向空数组的键。在下一步中,我再次"遍历"所有元素,然后将它们添加到 propper 状态数组中。

// Split into state arrays
array_walk($input, function ($item) use (&$weeklies) {
    $state = substr($item, -2);
    $weeklies[$state][] = $item;
});

(你看这怎么可能一步到位?如果你愿意,你可以用foreach而不是array_walk(

现在你留下了这样的东西:

Array
(
    [NY] => Array
        (
            [0] => 20151227NY
            [1] => 20151226NY
            [2] => 20151221NY
            [3] => 20140313NY
            [4] => 20140228NY
            [5] => 20140227NY
            [6] => 20140123NY
            [7] => 20140102NY
        )
    [CT] => Array
        (
            [0] => 20151125CT
            [1] => 20140226CT
            [2] => 20140122CT
        )
    [NH] => Array
        (
            [0] => 20140226NH
        )
    [NJ] => Array
        (
            [0] => 20140128NJ
            [1] => 20140121NJ
            [2] => 20131231NJ
        )
)

要为每个州选择最新的日期,您需要对日期进行排序,因为无法保证文件系统中的顺序(从您的数据来看(。排序后,我们选择最后的那个。我正在使用array_pop因为您可能有一周有一天失败或其他什么,所以最好不要依赖完美的数据:

$weeklies_latest = array_combine(array_keys($weeklies), array_map(function ($item) {
    sort($item);
    return array_pop($item);
 }, $weeklies));

我正在使用array_combine因为 PHP 没有适用于关联数组的内置array_map

$weekly_latest现在包含以下内容:

Array
(
    [NY] => 20151227NY
    [CT] => 20151125CT
    [NH] => 20140226NH
    [NJ] => 20140128NJ
)