簡體   English   中英

從包含特定字符串的數組創建數組

[英]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為數組,給定null”“警告:array_pop()期望參數1為數組,給定null” 。 我正在這樣調用$ 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
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM