:::: MENU ::::
Posts tagged with: multidimensional

Multidimensional Array Search in PHP

Working with Arrays

Array’s are a great way to logical group and order large sets of data. Recently, I was working on a project k

To support the search functionality, I figured there would be no easy way to just use array_filter and array_search. Resource cost was also a big factor; for‘s and foreach‘s just wouldn’t work.

Below you will find a multidimensional_array_search function which will return all the arrays that contain the search string within it.

The Function:

The goal of the function is to return the parent array for what the content was found in:

/******************************* 
*   array_multi_search 
* 
*   @array  array to be searched 
*   @input  search string 
* 
*   @return array(s) that match 
******************************/  
function array_multi_search($array, $input){  
    $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));  

    foreach($iterator as $id => $sub){ 
        $subArray = $iterator->getSubIterator(); 
            if(@strstr(strtolower($sub), strtolower($input))){ 
                $subArray = iterator_to_array($subArray); 
                $outputArray[] = array_merge($subArray, array('Matched' => $id)); 
            } 
    } 

    return $outputArray; 
}

The above function is a smorgasburg of snippets I found on the PHP.Net docs and stackoverflow. I optimized it to return the array that is matched and the Match string to make it as useful as possible. Give it a go, and let me know how it works.

Example:

To test this code, you can use the following sample code:

$array = array( "a" => array( 
                    "b" => array( 
                        "c" => array( 
                            "d" => array( 
                                "e" => "HighOnPHP" 
                             ) 
                         ) 
                     ), 
                     "1" => array( 
                         "Two" => 3 
                      ), 
                     "CCD" => array( 
                         "DFfsdf" => array( 
                             "HighOnPHP" 
                          ), 
                     ), 
                ),
                "A" => array( 
                    "Twelve" => 3 
                ), 
                "Another" => "HighOnPHP" 
             ); 

print_r(
    array_multi_search($array, 'HighOnPHP')
); // [Another], [CCD] and [A] 

print_r(
    array_multi_search($array, 'e')
); //Returns [A], [Another] and [a][b]

[d][e]

Summary

This is not the best solution for this, but it works. It’s simple user-land code and gets the job done. If you have a better solution please share!