2016-02-10 95 views
1

我有一個從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)); 

似乎工作得很好,但我在得到這兩個錯誤頁的頂部: 「警告:排序()預計參數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> 
+0

可以提供一個例子:原始文件路徑=>數組實際結果=>所需的陣列結果 – fusion3k

+0

上面的陣列結果是從DIR陣列I有一個實際excert。我希望他們成爲他們自己的數組,如下所示: $ ny_weekly = array('20151227NY','20151221NY','20151214NY'等等); $ ct_weekly = array('20151220CT','20151214CT','20151208CT'等...); 等... – Goten13

回答

1

我通常在兩個步驟中這樣做,因爲它使代碼更具可讀性。

首先我準備的結果基於狀態,使用和array_map

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

此生成與狀態的陣列指向空數組鍵array_fill_keys的組合。在下一步中,我再次「遍歷」所有元素,然後將它們添加到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因爲你可能有一個星期,其中1天失敗或諸如此類的東西,所以最好不要依賴於完善的數據:

$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 
) 
+0

這工程!只有一件事,即使它看起來工作,我也會得到2個錯誤:「警告:sort()期望參數1是數組,null給出」和「警告:array_pop()期望參數1是數組,null給出」 。 – Goten13

+0

**請參閱編輯問題** – Goten13

+0

@Genen13是的,您正在使用「填充」部分錯誤。刪除_if「NY」_部分。你的目標是什麼?如果只是以不同的方式獲得紐約。 – Michael

相關問題