У меня есть два массива, которые я хочу связать вместе при работе с ними ...

    $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";

Я хочу, чтобы вход также влиял на второй массив: когда первый массив получает свой результат из первых 2, то второй массив тоже должен иметь его из первых 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
)

Я хочу, чтобы он мог связывать $ dat и $ word, чтобы результат для word тоже был

Array
(
    [0] => Attend To
    [1] => Explore
)
1
Mira BeeCalifonia 1 Июн 2020 в 15:55

3 ответа

Лучший ответ

Исходные ключи будут сохранены после array_filter, поэтому получите записи для ключей, которые являются одинаковыми, вычисляя пересечение. Похоже, что $word является массивом из одного элемента со строкой, поэтому просто взорвите его:

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

Смотрите демонстрационную версию.

Если один из массивов имеет уникальные значения, вы можете объединить массив и просто работать с ним.

$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).

2
AbraCadaver 1 Июн 2020 в 13:22

Возможное решение, предполагающее, что массивы имеют одинаковые ключи (я изменил его, чтобы отразить это), заключается в использовании константы 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 идеально подходит, когда требуется только фильтрация, но это может быть полезно, если кто-то должен выполнить дополнительные операции в обратном вызове фильтра.

0
Kaddath 1 Июн 2020 в 13:24

Я не нахожу функциональное программирование очень читабельным / привлекательным для этого случая. Просто используйте простой цикл foreach и условно захватите слова, связанные общими индексами.

Поскольку два массива имеют общие индексы, нет необходимости работать с combine двумя массивами - просто ссылаться на индексы.

Код: (Демонстрация)

$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',
)
2
mickmackusa 1 Июн 2020 в 13:33