我有一个从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"等)。有任何想法吗?
**更新:**我已根据Michael的建议添加/修改了代码,因此我的代码现在看起来像这样:
$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为数组,给定"为空。我这样调用$ weeklies_latest数组:
<a href="/COMM/email/weekly/<? echo $weeklies_latest[$template->State] ?>/weekly.html" class="button-link button-link-blue">CURRENT ISSUE</a>
答案 0 :(得分:1)
我通常分两步完成,因为它使代码更具可读性。
首先,我使用array_fill_keys
和array_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
)