Search code examples
phparraysarray-filter

Use array_filter on multi dimensional array


I'm trying to filter an array that looks like this

$array = array(
    "id" => "SomeID",
    "name" => "SomeName",
    "Members" => array(
        "otherID" => "theValueIamLookingFor",
        "someOtherKey" => "something"
    )
);

Now, I'm filtering for data sets, where "otherID" is a certain value. I know I could use array_filter to filter for "id", but I can't for the life of me figure out how to filter for a value in an array inside an array.

Adding some of the data as provided by the WebAPI (I run that through json_decode to create an associative array before all this filtering business)

[
{
"id": "b679d716-7cfa-42c4-9394-3abcdged",
"name": "someName",
"actualCloseDate": "9999-12-31T00:00:00+01:00",
"members": [
  {
    "otherID": "31f27f9e-abcd-1234-aslkdhkj2j4",
    "name": "someCompany"
  }
],
"competitor": null,
},
{
"id": "c315471f-45678-4as45-457-asli74hjkl",
"name": "someName",
"actualCloseDate": "9999-12-31T00:00:00+01:00",
"members": [
  {
    "otherID": "askgfas-agskf-as",
    "name": "someName"
  }
],
"competitor": null,

}, ]


Solution

  • You can do something like:

    $arr = array(
        array(
            "id" => "SomeID",
            "name" => "SomeName",
            "Members" => array (
                    "otherID" => "ThisIsNottheValueIamLookingFor",
                    "someOtherKey" => "something"
                )
        ),
        array(
            "id" => "SomeID",
            "name" => "SomeName",
            "Members" => array (
                    "otherID" => "theValueIamLookingFor",
                    "someOtherKey" => "something"
                )
        ),
        array(
            "id" => "SomeID",
            "name" => "SomeName",
            "Members" => array (
                    "otherID" => "ThisIsNottheValueIamLookingForEither",
                    "someOtherKey" => "something"
                )
        ),
    );
    
    $result = array_filter($arr, function( $v ){
        return $v["Members"]["otherID"] == "theValueIamLookingFor";
    });
    

    This will result to:

    Array
    (
        [1] => Array
            (
                [id] => SomeID
                [name] => SomeName
                [Members] => Array
                    (
                        [otherID] => theValueIamLookingFor
                        [someOtherKey] => something
                    )
    
            )
    
    )
    

    Here is the doc for more info: http://php.net/manual/en/function.array-filter.php


    UPDATE

    On you Updated array, the structure of array is different. You have to use $v["members"][0]["otherID"] to get the otherID

    Please try the code below:

    $result = array_filter($arr, function( $v ){
        return $v["members"][0]["otherID"] == "theValueIamLookingFor";
    });