Найти ключ => значение в многомерном массиве, но вернуть родительский ключ?

Я пытаюсь перебрать массив и вернуть ключ и дочерний массив массива, который имеет заданное значение ключа =>.

Например...

скажем, у меня есть

array(0 => array("chicken" => "free"), 1 => array("chicken" => "notfree"));

И я хочу получить массив array("chicken" => "notfree") и знать, что родительский ключ 1

У меня есть следующее...

function search($array, $key, $value) {
    $arrIt = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));

    foreach($arrIt as $sub) {
        $subArray = $arrIt->getSubIterator();
        $subKey = $arrIt->key();
        if(isset($subArray[$key]) && $subArray[$key] === $value) {
            return array("key" => $subKey, "array" => iterator_to_array($subArray));
        }
    }
}

Я могу легко получить "chicken" => "notfree", но я не могу получить родительский ключ, $arrIt->key() продолжает возвращать значение null? Любые идеи?


person Steven    schedule 17.09.2013    source источник


Ответы (2)


Вы должны установить значение ключа внутри цикла foreach, это будет ключ вашего текущего местоположения в массиве.

foreach ($array as $key => $value) {
    //$key here is your 0/1
    foreach ($value as $_key => $_value) {
        //the inner pairs
        //e.g. $_key = 'chicken' & $_value = 'free'
    }
}

Вам не нужно создавать итератор, который уже поместил его на уровень ниже.

person thepratt    schedule 17.09.2013
comment
Это не работает, pastie.org/8333181, если вы запустите это, вы увидите, что он возвращает "chicken", я не не хочу "chicken" Мне нужен родительский ключ (или 1 в данном случае). - person Steven; 17.09.2013
comment
Я предполагаю, что у вас будет более 1 пары внутри каждого массива, поэтому я поместил внутрь еще один foreach, чтобы продемонстрировать, что вы можете их вкладывать. - person thepratt; 18.09.2013

Используйте форму foreach с двумя аргументами, чтобы получить переменную, содержащую «родительский» ключ:

foreach($arrIt as $parentKey => $sub) {
    ....
    if(isset(...)) {
        return $parentKey;
    }
}
person Marc B    schedule 17.09.2013
comment
Это не работает, pastie.org/8333181, если вы запустите это, вы увидите, что он возвращает "chicken", я не не хочу "chicken" Мне нужен родительский ключ (или 1 в данном случае). - person Steven; 17.09.2013