In PHP ist Array_filter () eine sehr leistungsstarke Funktion, die Arrays basierend auf der Rückruffunktion filtern kann. In großen Projekten oder Szenarien, in denen eine ähnliche Filterlogik an mehreren Stellen verwendet wird, ist das Schreiben direkter anonymer Funktionen an jedem Rufpunkt nicht förderlich wie die Wiederverwendung und Wartung von Code. In diesem Artikel wird eingeführt, wie die Filterlogik von Array_Filter () in eine wiederverwendbare Komponente eingebaut werden kann, um Ihren Code eleganter und wartbarer zu gestalten.
Schauen wir uns zunächst die grundlegendste Verwendung an:
$data = [1, 2, 3, 4, 5];
// Filtern Sie auch Zahlen heraus
$filtered = array_filter($data, function($item) {
return $item % 2 === 0;
});
print_r($filtered);
Obwohl der obige Code einfach ist, werden wir, wenn wir an mehreren Stellen die Logik der "Filterung von geraden Zahlen" benötigen, vor dem Problem der Code -Duplikation konfrontiert.
Wir können häufig verwendete Filterlogik in eine Klasse einkapseln und sie über eine einheitliche Schnittstelle aufrufen, um eine Wiederverwendbarkeit zu erreichen.
class ArrayFilter
{
protected array $data;
public function __construct(array $data)
{
$this->data = $data;
}
public function filter(callable $callback): array
{
return array_filter($this->data, $callback);
}
}
Wie man verwendet:
$data = [1, 2, 3, 4, 5];
$filter = new ArrayFilter($data);
$result = $filter->filter(function ($item) {
return $item % 2 === 0;
});
print_r($result);
Um die Logik weiter zu entkoppeln, können wir die Filterbedingungen in "Strategieklassen" einschließen:
interface FilterStrategyInterface
{
public function apply($item): bool;
}
class EvenNumberFilter implements FilterStrategyInterface
{
public function apply($item): bool
{
return $item % 2 === 0;
}
}
Ändern Sie dann die ArrayFilter -Klasse, um diese Richtlinie zu erhalten:
class StrategyArrayFilter
{
protected array $data;
public function __construct(array $data)
{
$this->data = $data;
}
public function filter(FilterStrategyInterface $strategy): array
{
return array_filter($this->data, [$strategy, 'apply']);
}
}
Wie man verwendet:
$data = [1, 2, 3, 4, 5];
$filter = new StrategyArrayFilter($data);
$result = $filter->filter(new EvenNumberFilter());
print_r($result);
Auf diese Weise kann jede Filterlogik separat als Klasse definiert werden, wodurch eine gute Code -Organisationsstruktur für einfache Prüfung und Wiederverwendung implementiert wird.
Wenn Sie Filter flexibler konfigurieren möchten (z. B. Richtlinien basierend auf Konfigurationsdateien), können Sie eine "Werksklasse" oder "Service -Registrierungsmechanismus" hinzufügen. Hier ist ein einfaches Beispiel für die Registrierung von Service:
class FilterFactory
{
public static function create(string $type): FilterStrategyInterface
{
return match ($type) {
'even' => new EvenNumberFilter(),
default => throw new InvalidArgumentException("Unknown filter type: $type")
};
}
}
Die Verwendung ist wie folgt:
$filterType = 'even'; // Nehmen Sie aus der Konfiguration oder der Benutzereingabe an
$strategy = FilterFactory::create($filterType);
$filter = new StrategyArrayFilter([1, 2, 3, 4, 5]);
$result = $filter->filter($strategy);
print_r($result);
Durch Einkapseln der Rückruffunktion von Array_filter () in eine Klasse können wir eine klarere, die Codestruktur leichter zu testen und aufrechtzuerhalten. Dieses Strategiemuster ist sehr geeignet für die Behandlung komplexer oder variabler Filterlogik, insbesondere in großen Anwendungen.