Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Recursive array_search

Tags:

arrays

php

search

I have a multi-dimensional array:

$categories = array(
    array(
        'CategoryID' => 14308,
        'CategoryLevel' => 1,
        'CategoryName' => 'Alcohol & Food',
        'CategoryParentID' => 14308
    ),
    // CHILD CATEGORIES
    array(
        array(
            'CategoryID' => 179836,
            'CategoryLevel' => 2,
            'CategoryName' => 'Alcohol & Alcohol Mixes',
            'CategoryParentID' => 14308
        ),
        array(
            array(
                'CategoryID' => 172528,
                'CategoryLevel' => 2,
                'CategoryName' => 'Antipasto, Savoury',
                'CategoryParentID' => 14308
            )
        )
    )
);

I need to get the exact location of the index, and since array_search doesn't work on multi-dimensional arrays, I'm using one of the functions provided on the PHP manual page.

function recursive_array_search($needle,$haystack) {
    foreach($haystack as $key=>$value) {
        $current_key=$key;
        if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
            return $current_key;
        }
    }
    return false;
}

.. but it also returns the key of the first array only:

echo recursive_array_search(172528, $categories); // outputs 1

I'm expecting:

[1][1][0]
like image 396
eozzy Avatar asked Feb 12 '15 08:02

eozzy


People also ask

What is recursive count in PHP?

value. An array or Countable object. mode. If the optional mode parameter is set to COUNT_RECURSIVE (or 1), count() will recursively count the array. This is particularly useful for counting all the elements of a multidimensional array.

How do you find an array key?

The array_keys() function is used to get all the keys or a subset of the keys of an array. Note: If the optional search_key_value is specified, then only the keys for that value are returned. Otherwise, all the keys from the array are returned. Specified array.


Video Answer


2 Answers

You can change your recursive function like this, which should give you the solution:

function recursive_array_search($needle, $haystack, $currentKey = '') {
    foreach($haystack as $key=>$value) {
        if (is_array($value)) {
            $nextKey = recursive_array_search($needle,$value, $currentKey . '[' . $key . ']');
            if ($nextKey) {
                return $nextKey;
            }
        }
        else if($value==$needle) {
            return is_numeric($key) ? $currentKey . '[' .$key . ']' : $currentKey . '["' .$key . '"]';
        }
    }
    return false;
}

This will result in

[1][1][0]["CategoryID"]

Since CategoryID is also a key in your multidimensional array.

If you don't want this, you can adapt the function to

function recursive_array_search($needle, $haystack, $currentKey = '') {
    foreach($haystack as $key=>$value) {
        if (is_array($value)) {
            $nextKey = recursive_array_search($needle,$value, $currentKey . '[' . $key . ']');
            if ($nextKey) {
                return $nextKey;
            }
        }
        else if($value==$needle) {
            return is_numeric($key) ? $currentKey . '[' .$key . ']' : $currentKey;
        }
    }
    return false;
}
like image 119
Pieter De Schepper Avatar answered Oct 20 '22 05:10

Pieter De Schepper


You are ignoring the returned value of your inner call to recursive_array_search. Don't do that.

/*
 * Searches for $needle in the multidimensional array $haystack.
 *
 * @param mixed $needle The item to search for
 * @param array $haystack The array to search
 * @return array|bool The indices of $needle in $haystack across the
 *  various dimensions. FALSE if $needle was not found.
 */
function recursive_array_search($needle,$haystack) {
    foreach($haystack as $key=>$value) {
        if($needle===$value) {
            return array($key);
        } else if (is_array($value) && $subkey = recursive_array_search($needle,$value)) {
            array_unshift($subkey, $key);
            return $subkey;
        }
    }
}
like image 2
Oswald Avatar answered Oct 20 '22 06:10

Oswald