Рекурсия массивов в php

593
25 декабря 2016, 22:38

Подскажите, пожалуйста, как работает рекурсия, и как написать такую функцию, чтоб она могла проходить по всему массиву и удалить определённый элемент. Или просто дайте, пожалуйста, пример такой функции. Остальное я сам сделаю, я не могу понять, как это должно работать. Спасибо.

(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => text
                    [1] => created_ad
                )
            [1] => required
        )
    [1] => Array
        (
            [0] => Array
                (
                    [0] => id_user
                    [1] => priority
                    [2] => status
                    [3] => created_ad
                )
            [1] => integer
        )
    [2] => Array
        (
            [0] => Array
                (
                    [0] => text
                    [1] => img
                )
            [1] => string
        )
    [3] => Array
        (
            [0] => id_user
            [1] => safe
        )
    [4] => Array
        (
            [0] => priority
            [1] => default
            [value] => 0
        )
    [5] => Array
        (
            [0] => status
            [1] => default
            [value] => 0
        )
    [6] => Array
        (
            [0] => priority
            [1] => in
            [range] => Array
                (
                    [0] => 0
                    [1] => 1
                    [2] => 2
                )
        )
    [7] => Array
        (
            [0] => status
            [1] => in
            [range] => Array
                (
                    [0] => 0
                    [1] => 1
                    [2] => 2
                )
        )
)

Из этого массива нужно удалить id_user и created_ad

private function unsetRules($rules = null)
{
    foreach ($rules as $key => &$rule) {
        if (is_array($rules[$key])) {
            $this->unsetRules($rules[$key]);
        }
        if ($rules[$key] === 'id_user') {
            unset($rules[$key]);
        }
    }
    return $rules;
}

Вот так ничего не выходит=(

Answer 1
private function unsetRules(&$array)
{
    foreach ($array as $key => &$value) {
        if (is_array($value)) {
            $this->unsetRules($value);
        } else {
            if (in_array($array[$key], $this->deleteRules())) {
                unset($array[$key]);
            }
        }
    }
}

Все получается довольно просто, нужно было использовать массив по ссылке

Answer 2

Наверное, так:

foreach ($array as $i => $value) {
    if ($array[$i] == 0) {
        unset($array[$i]);
    }
}

Только каким боком тут рекурсия?

Answer 3

Рекурсивная функция обращается сама к себе, при необходимости и выполняет проверку по новым элементам, пример проверки элементов по рекурсией по вложенным объектам:

// рекурсивная функция проверки
function arrayChecking(array $some_array){
    foreach ($some_array as $key=>$value){
        if(is_array($value)){
            arrayChecking($value); // здесь рекурсивный вызов функцией самой себя, с новым вложенным массивом, когда функция закончит его обрабатывать, она вернется к месту прерывания и продолжит работу с родительским массивом и т.д. 
        }
        if($value == "ваше значение"){
            // ваше действие
        }
    }    
}
$array_for_checkig = array();
arrayChecking($array_for_checkig);

Как удалить рекурсией не подскажу. Нужно додумать. Если нужно удалить элемент массива по значению, то в простом массиве делается следующим образом:

$array = array('key1' => 'Item 1', 'key2' => 'Item 2','Key3' => 'Всякая фигня');
if(($key = array_search('Всякая фигня',$array)) !== FALSE){
     unset($array[$key]);
}
READ ALSO
Зачем и как разделять код в PHP?

Зачем и как разделять код в PHP?

Наверное вопрос типичный, но типичные ответы я прочитал

352
Получить УРЛ из JSON

Получить УРЛ из JSON

Добрый деньПосле некоторых манипуляций страница на моем сайте выдает следующий JSON:

492
Не корректная работа ng-repeat (Error: [ngRepeat:dupes] )

Не корректная работа ng-repeat (Error: [ngRepeat:dupes] )

Имею следующий контроллер:

484
Как заменить точку в слове?

Как заменить точку в слове?

ЗдравствуйтеКак во всем тексте заменить символ точки, который стоит только внутри самого слова?

348