Можно ли удалить весь массив на основе наличия одного значения без перестройки массива? - PullRequest
1 голос
/ 09 июня 2011

У меня есть два массива, первый ($ Needles) содержит набор объектов, второй ($ stack) содержит набор ключей / значений, но где одно значение представляет собой массив объектов, аналогичный первому массиву.

Как я могу удалить все объекты в пределах значения target_p в $ stack, где c_id соответствует любому из объектов в $ needle?

Спасибо

Array ($needles)
(
    [0] => stdClass Object
        (
            [c_id] => 305164
            [neg] => 
            [seconds] => 604800
            [f_min] => 10
        )

    [1] => stdClass Object
        (
            [c_id] => 305165
            [neg] => 
            [seconds] => 604800
            [fr_min] => 10
        )

    [2] => stdClass Object
        (
            [c_id] => 305166
            [neg] => 
            [seconds] => 604800
            [f_min] => 10
        )

)
*****************
Array ($stack)
(
    [req_all] => 
    [target_p] => Array
        (
            [0] => stdClass Object
                (
                    [c_id] => 305164
                    [pid] => 2323554
                    [neg] => 
                    [seconds] => 
                    [f_min] => 
                )

            [1] => stdClass Object
                (
                    [c_id] => 305165
                    [pid] => 1964608
                    [neg] => 
                    [seconds] => 
                    [f_min] => 
                )

            [2] => stdClass Object
                (
                    [c_id] => 305166
                    [neg] => 1
                    [seconds] => 604800
                    [f_min] => 
                )

            [3] => stdClass Object
                (
                    [c_id] => 305167
                    [neg] => 1
                    [seconds] => 604800
                    [f_min] => 
                )

            [4] => stdClass Object
                (
                    [c_id] => 314022
                    [pid] => 4950148
                    [neg] => 
                    [seconds] => 
                    [f_min] => 
                )

        )

    [logical_e] => 
)

Желаемый результат:

Array ($stack)
(
    [req_all] => 
    [target_p] => Array
        (
            [0] => stdClass Object
                (
                    [c_id] => 305167
                    [neg] => 1
                    [seconds] => 604800
                    [f_min] => 
                )

            [1] => stdClass Object
                (
                    [c_id] => 314022
                    [pid] => 4950148
                    [neg] => 
                    [seconds] => 
                    [f_min] => 
                )

        )

    [logical_e] => 
)

Ответы [ 3 ]

1 голос
/ 09 июня 2011

Используя unset () ?.

Не думаю, что я четко понял, что именно вам нужно, и поэтому 2 примера (вы действительно должны дать желаемый результат, чтобы мы могли проверить, правильно ли мы вас поняли).

Чтобы удалить элемент массива из $ stack ['target_p'], если c_id такого элемента совпадает с массивом $ Needles:

foreach ($stack['target_p'] as $k => $v)
{
    foreach ($needles as $needle)
    {
        if ($v->c_id == $needle->c_id) {
            unset($stack['target_p'][$k]);
        }
    }
}

Чтобы удалить все элементы массива из $ stack ['target_p'], если any c_id совпадает с массивом $ Needles:

foreach ($stack['target_p'] as $k => $v)
{
    foreach ($needles as $needle)
    {
        if ($v->c_id == $needle->c_id) {
            $stack['target_p'] = array(); // will delete elements but preserver target_p key
            // or
            unset($stack['target_p']); // will delete elements & target_p key

            break 2; // exit from both foreach loops
        }
    }
}
1 голос
/ 09 июня 2011

Без перестройки массива?На самом деле, нет.Но это все еще просто.

Перестройте массив игл с ключами, соответствующими значениям c_id:

$o_needles = array();
foreach ($needles as $needle) {
    $o_needles[$needle->c_id] = $needle;
}

Затем удалите все узлы в стеке, у которых значение c_id соответствует ключув модифицированном массиве игл:

foreach ($stack['target_p'] as $key => $obj) {
    if (array_key_exists($obj->c_id, $o_needles)) {
        unset($stack['target_p'][$key]);
    }
}

Производительность / сложность O (n + m) .

Если бы вы использовали такую ​​функцию, как array_map, array_walk, array_filter или вложенный foreach, вам нужно будет просмотреть каждую из игл для каждого элемента в стеке, что будет менее эффективно, особенно с большими наборами данных ( O (n* м) ).

0 голосов
/ 09 июня 2011

Использование array_filter().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...