J'ai deux baies que je veux relier lors de leur fonctionnement ...

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

Je veux que l'entrée affecte également le deuxième tableau, lorsque le premier tableau obtient son résultat à partir des 2 premiers, le deuxième tableau devrait également l'avoir à partir des 2 premiers

//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;
});

Et le résultat est

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

Je veux qu'il puisse lier $ dat et $ word afin que le résultat pour mot soit également

Array
(
    [0] => Attend To
    [1] => Explore
)
1
Mira BeeCalifonia 1 juin 2020 à 15:55

3 réponses

Meilleure réponse

Les clés d'origine seront conservées après array_filter, donc obtenez les entrées pour les clés qui sont les mêmes en calculant l'intersection. Il semble que $word est un tableau à un élément avec une chaîne, alors éclatez-le simplement:

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

Voir une Démo.

Si l'un des tableaux a des valeurs uniques, vous pouvez combiner le tableau et simplement opérer dessus.

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

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

Cela donne:

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

Vous pouvez utiliser le tableau tel quel ou utiliser array_keys pour obtenir les clés en tant que tableau $word.

S'il n'est pas garanti qu'il soit $word[0], vous pouvez utiliser reset($word) ou current($word).

2
AbraCadaver 1 juin 2020 à 13:22

Une solution possible en supposant que les tableaux ont les mêmes clés (je l'ai changé pour refléter cela), est d'utiliser la constante ARRAY_FILTER_USE_BOTH à array_filter, de sorte que la clé soit disponible dans la fonction de rappel.

Ici je remplis un deuxième tableau $result2 avec les mots tout en filtrant les données (notez que les choses sont ajoutées dans use et $result2 est passé par référence):

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

La réponse d'AbraCadaver est parfaitement adaptée lorsque seul le filtrage est nécessaire, mais cela peut être utile au cas où quelqu'un devrait effectuer des opérations supplémentaires dans le rappel de filtre.

0
Kaddath 1 juin 2020 à 13:24

Je ne trouve pas que la programmation fonctionnelle soit très lisible / attrayante dans ce cas. Utilisez simplement une simple boucle foreach et saisissez conditionnellement les mots liés par les index partagés.

Puisque les deux tableaux partagent des indices communs, il est inutile de combine les deux tableaux - il suffit de référencer les indices.

Code: (Démo)

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

Production:

array (
  0 => 'Attend To',
  1 => 'Explore',
)
2
mickmackusa 1 juin 2020 à 13:33