如何关联和过滤两个相关的数组?

How to associate and filter two related arrays?

我有两个数组,我想在处理它们时link在一起。

$dat = array(
    "2020-02-01", 
    "2020-02-05",
    "2020-02-10",
    "2020-02-12",
    "2020-02-15"
);
$word = array(
    "Attend To,Explore,Unaided,dull,bad"
); 

//User input
$start = "2020-01-01";
$end = "2020-02-07";

我希望输入也影响第二个数组,所以当第一个数组从前 2 个数组中获取结果时,第二个数组也应该从第一个数组中获取结果。

//Filter out dates between start and end date
$result = array_filter($dat, function($data_item) use($start, $end) {
    return $data_item >= $start && $data_item <= $end;
});

结果是

Array
(
    [0] => 2020-02-01
    [1] => 2020-02-05
)

我希望它能够 link $dat$word 这样 word 的结果也将是

Array
(
    [0] => Attend To
    [1] => Explore
)

array_filter后会保留原键,所以通过交集得到相同键的条目。看起来 $word 是一个带有字符串的单元素数组,所以直接分解它:

$word_result = array_intersect_key(explode(',', $word[0]), $result);

看到一个Demo

如果其中一个数组具有唯一值,您可以组合数组并仅对其进行操作。

$comb = array_combine(explode(',', $word[0]), $dat);

$result = array_filter($comb, function($data_item) use($start,$end) {
    return $data_item >= $start && $data_item <= $end;
});

这产生:

Array
(
    [Attend To] => 2020-02-01
    [Explore] => 2020-02-05
)

您可以按原样使用数组或使用 array_keys 获取键作为 $word 数组。

如果不能保证是$word[0]那么你可以使用reset($word)或者current($word).

一个可能的解决方案假设数组具有相同的键(我改变它以反映这一点),是使用常量 ARRAY_FILTER_USE_BOTHarray_filter,这样键就可以在回调函数。

这里我在过滤数据时用单词填充第二个数组$result2(注意,东西是在use中添加的,$result2是通过引用传递的):

$dat = array("2020-02-01","2020-02-05","2020-02-10","20-02-12","2020-02-15");
$word = array("Attend To","Explore","Unaided","dull","bad"); 

//User input
$start = "2020-01-01";
$end = "2020-02-07";

//Filter out dates between start and end date
$result2 = [];
$result = array_filter($dat, function($data_item, $key) use($start, $end, $word, &$result2) {
    if($data_item >= $start && $data_item <= $end){
        $result2[$key] = $word[$key];
        return true;
    }
    return false;
}, ARRAY_FILTER_USE_BOTH);

当只需要过滤时,AbraCadaver 的答案非常适合,但如果有人必须在过滤器回调中执行额外操作,这可能很有用..

对于这种情况,我认为函数式编程不是很 readable/attractive。只需使用一个简单的 foreach 循环并有条件地获取共享索引相关的单词。

由于这两个数组共享公共索引,因此 combine 这两个数组没有必要工作 -- 只需引用索引即可。

代码:(Demo)

$dat = ["2020-02-01", "2020-02-05", "2020-02-10", "20-02-12", "2020-02-15"];
$word = ["Attend To,Explore,Unaided,dull,bad"];
$words = explode(',', $word[0]);

//User input
$start = "2020-01-01";
$end = "2020-02-07";

$result = [];
foreach ($dat as $index => $date) {
    if ($date >= $start && $date <= $end) {
        $result[] = $words[$index];
    }
}
var_export($result);

输出:

array (
  0 => 'Attend To',
  1 => 'Explore',
)