Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to filter an associative array?

I have to deal with a refactoring, to reduce the number of lines of code in PHP, to filter an associative array. So I'm making a select from DB in MySQL, to get an associative array. So my "Object" has a category and a surname field.

while ($row = mysqli_fetch_array($result)) {
        $array[] = $row['category'];
        $array[] = $row['Surname'];
   }

I want to obtain from this array, as many other sub-array, splitted by the category. I mean the category Array identification may be:

$categories = array("A","B","C","D");

So what I want, is to obtain one Array for each Category, which contains all the Surname, of that category. So suppose that the method works, something like that:

$arrayFiltered = method_filter($array_asso,"A");

At the end I want something like that:

    foreach ($categories as &$value) {
       $arrayFiltered = method_filter($array_asso,$value);
       my_method_which_needs_the_filtered_array($arrayFiltered);
}

Thank you in advance for your help.

like image 353
I love coding Avatar asked Apr 30 '15 10:04

I love coding


Video Answer


2 Answers

As far as i get you - you need one array which will contain all the surname category wise so that you can access them easily. This should help -

while ($row = mysqli_fetch_array($result)) {
    $categories[$row['category']][] = $row['Surname'];
}

Simply store the category as key and all the surname as values to that key.

like image 180
Sougata Bose Avatar answered Oct 11 '22 20:10

Sougata Bose


Sergeant's approach is the easiest. Just for the sake of it, here is an approach with array_filter() (just in case you have to have an unfiltered array as well):

$array = [];
$categories = array("A","B","C","D");

while ($row = mysqli_fetch_array($result)) {
    $item = [
        'category' => $row['category'],
        'surname' => $row['Surname']
    ];

    $array[] = $item;
}

$categorized = [];

foreach ($categories as $category) {
    $categorized[$category] = array_filter($array, function($item) use ($category) {
        return $item['category'] == $category;
    });
}

Here is a proof of concept without the need of a database connection:

$categories = array("A","B","C","D");

$array = [
    ['category' => 'A', 'Surname' => 'A Name 1'],
    ['category' => 'A', 'Surname' => 'A Name 2'],
    ['category' => 'B', 'Surname' => 'B Name 1'],
    ['category' => 'B', 'Surname' => 'B Name 2'],
    ['category' => 'B', 'Surname' => 'B Name 3'],
    ['category' => 'C', 'Surname' => 'C Name'],
];

$categorized = [];

foreach ($categories as $category) {
    $categorized[$category] = array_filter($array, function($item) use ($category) {
        return $item['category'] == $category;
    });
}

print_r($categorized);

Output:

Array
(
    [A] => Array
        (
            [0] => Array
                (
                    [category] => A
                    [Surname] => A Name 1
                )

            [1] => Array
                (
                    [category] => A
                    [Surname] => A Name 2
                )

        )

    [B] => Array
        (
            [2] => Array
                (
                    [category] => B
                    [Surname] => B Name 1
                )

            [3] => Array
                (
                    [category] => B
                    [Surname] => B Name 2
                )

            [4] => Array
                (
                    [category] => B
                    [Surname] => B Name 3
                )

        )

    [C] => Array
        (
            [5] => Array
                (
                    [category] => C
                    [Surname] => C Name
                )

        )

    [D] => Array
        (
        )

)
like image 24
jeromegamez Avatar answered Oct 11 '22 19:10

jeromegamez