如何关联和过滤两个相关的数组?
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_BOTH
到 array_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',
)
我有两个数组,我想在处理它们时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_BOTH
到 array_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',
)