Search code examples
phparraysarray-column

Get multi column from array php, Alternate of array_column


I have used this function to get multi column from array. Alternate of array_column. I have created this function as array_column not work according my requirement.

My Data

$students = 
Array
(
    [0] => stdClass Object
        (
            [id] => 498
            [uuid] => 6cb91efd-9111-4be8-a2d7-80d3edeed732
            [name] => Andrew A. Blaine
            [email] => student14@gmail1.com
            [usertype_id] => 6
            [first_name] => Andrew A.
            [last_name] => Blaine
        )

    [1] => stdClass Object
        (
            [id] => 499
            [uuid] => 208764a0-c53d-404b-ad05-ee7cba28a51c
            [name] => Billie C. Heath
            [email] => student15@gmail1.com
            [usertype_id] => 6
            [first_name] => Billie C.
            [last_name] => Heath
        )
)

My function

  public function filterArrayByKeys($data, $keys = array()) {
    $filterData = array_map(function($e) use ($keys) {
        if (is_object($e)) {
            foreach ($keys as $key) {
                $filterArray[$key] = $e->$key;
            }
            return $filterArray;
        } else {
            foreach ($keys as $key) {
                $filterArray[$key] = $e[$key];
            }
            return $filterArray;
        }
    }, $data);
    return array_values(array_unique($filterData, SORT_REGULAR));
 }
 $students = $this->filterArrayByKeys($students, ['id', 'name', 'email']);

Now my result as I expected is:

$students = Array
(
    [0] => Array
        (
            [id] => 498
            [name] => Andrew A. Blaine
            [email] => student14@gmail1.com
        )

    [1] => Array
        (
            [id] => 499
            [name] => Billie C. Heath
            [email] => student15@gmail1.com
        )
)

You can use this function to get multi columns from array. Hope this will help you.


Solution

  • There is custom function to achieve this,

    public function filterArrayByKeys(array $input, array $column_keys)
    {
        $result      = array();
        $column_keys = array_flip($column_keys); // getting keys as values
        foreach ($input as $key => $val) {
             // getting only those key value pairs, which matches $column_keys
            $result[$key] = array_intersect_key($val, $column_keys);
        }
        return $result;
    }
    
    $a = $this->filterArrayByKeys($students, ['id','name','email']);
    print_r($a);
    

    array_flip — Exchanges all keys with their associated values in an array
    array_intersect_key — Computes the intersection of arrays using keys for comparison

    Output

    Array
    (
        [0] => Array
            (
                [id] => 498
                [name] => Andrew A. Blaine
                [email] => student14@gmail1.com
            )
    
        [1] => Array
            (
                [id] => 499
                [name] => Billie C. Heath
                [email] => student15@gmail1.com
            )
    
    )
    

    Working demo.

    Source.