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ć.