Rozbudowujemy nasz helper Arr o kolejne cztery metody. Poznajemy lepiej tablice i metody ich filtrowania. Do dzieła!
Pierwsza metoda, jaką dodamy, to where:
<?php
class Arr{
//(...)
public static function where($array, callable $callback)
{
return array_filter($array, $callback, ARRAY_FILTER_USE_BOTH);
}
}
$arr1 = ['name' => "John", 'age' => 30];
$filtered = Arr::where($arr1, function($val){
return is_string($val);
});
print_r($filtered);
//Array ( [name] => John )
Pozwala nam odfiltrować niechciane wartości. Druga to whereNotNull:
class Arr{
//(...)
public static function whereNotNull($array)
{
return static::where($array, fn ($value) => ! is_null($value));
}
}
$arr1 = ['name' => "John", 'age' => 30, 'job' => null];
print_r(Arr::whereNotNull($arr1));
//Array ( [name] => John [age] => 30 )
Ta metoda korzysta z wcześniej napisanej metody i funkcji lambda – odsiewając wartości, które są nullem.
Teraz metoda whereScalar:
class Arr{
//(...)
public static function whereScalar($array)
{
return static::where($array, fn ($value) => is_scalar($value));
}
}
$arr1 = ['name' => "John", 'age' => 30, 'job' => array()];
print_r(Arr::whereScalar($arr1));
//Array ( [name] => John [age] => 30 )
Ta metoda odsiewa typy złożone, takie jak tablica.
Swoją drogą, wróćmy jeszcze do pierwszego przykładu:
<?php
class Arr{
//(...)
public static function where($array, callable $callback)
{
return array_filter($array, $callback, ARRAY_FILTER_USE_BOTH);
}
//(...)
}
$arr1 = ['name' => "John", 'age' => 30];
$filtered = Arr::where($arr1, function($val){
return is_string($val);
});
print_r($filtered);
//Array ( [name] => John )
Mamy tutaj do czynienia z ARRAY_FILTER_USE_BOTH, więc jak widać nie ma problemu, aby jeden argument przekazać do callbacka.
No chyba, że mamy bardzo specjalne wymagania:
<?php
class Arr{
//(...)
public static function where($array, callable $callback)
{
return array_filter($array, $callback, ARRAY_FILTER_USE_BOTH);
}
//(...)
}
$arr1 = ['name' => "John", 'age' => 30];
$filtered = Arr::where($arr1, function($v, $k){
return is_string($k) && is_int($v);
});
print_r($filtered);
//Array ( [age] => 30 )
Pamiętać tylko musimy, że w PHP pierwszy argument to wartość a drugi to klucz. Napiszmy sobie jeszcze jedną metodę – removeKey:
<?php
class Arr{
//(...)
public static function removeKey($array, $key){
if(!array_key_exists($key, $array))
return;
return array_filter($array, function($k) use($key) {
return $k !== $key;
}, ARRAY_FILTER_USE_KEY);
}
}
$arr1 = ['name' => "John", 'age' => 30];
print_r(Arr::removeKey($arr1, 'name'));
//Array ( [age] => 30 )
print_r(Arr::removeKey($arr1, 'age'));
//Array ( [name] => John )
Helpera będziemy rozbudowywać.