PHP удаление всех элементов массива - PullRequest
0 голосов
/ 05 апреля 2020

Может кто-нибудь, пожалуйста, помогите мне понять и исправить; почему следующий код очищает все элементы массива. Код предназначен для рекурсивного удаления всех элементов в массиве, которые не имеют _label в своем ключе

function checkiflabel($item,$key){
   if(strpos($key,'_label')!==false)
        return true;
    else
        return false;
}
function walk_recursive_remove (array $array, callable $callback) {
    foreach ($array as $k => $v) {
        if (is_array($v)) {
            if (($callback($v, $k))==false)
                unset($array[$k]);
            else
                $array[$k] = walk_recursive_remove($v, $callback);
        } else {
            if (($callback($v, $k))==false) {
                unset($array[$k]);
            }
        }
    }
    return $array;
}

Я называю это с помощью

$data = walk_recursive_remove($data1,'checkiflabel');
print_r($data); die;

. Он показывает пустой массив и для конечно, $ data1 является массивом и имеет значения, потому что если я изменю

if (($callback($v, $k))==false) 

на

if ($callback($v, $k))

, он удалит все элементы, которые имеют _label, а остальные элементы в порядке. Ниже приводится print_r для $ data1 с некоторой обфускацией данных

Array ( [1] => Array (
    [gridReviewerDecision] => ACCEPTED
    [gridReviewerDecision_label] => Accepted
    [gridReviewerComment] => ok
    [gridReviewerComment_label] => ok
    [gridReviewerAcceptedAmount] => 100
    [gridReviewerAcceptedAmount_label] => 100
    [gridUploadFilesByReviewer] => Array (
        [0] => Array (
            [appDocUid] => 5810427715e892c81ab34c8030653093
            [name] => drawing.pdf
            [version] => 1
            )
        )
    [gridUploadFilesByReviewer_label] => Array (
        [0] => drawing.pdf
        )
    [gridContest] => 1
    [gridContest_label] => true
    [gridTypeOfMOtive] => AAAAA
    [gridTypeOfMOtive_label] => BBBBB
    [gridComment] => test 1
    [gridComment_label] => test 1
    [gridUploadFiles] => Array (
        [0] => Array (
            [appDocUid] => 3735522335e892c08eefa43074490443
            [name] => drawing.jpg
            [version] => 1
            )
        [1] => Array (
            [appDocUid] => 6071415935e892c10331426048606075
            [name] => drawing.png
            [version] => 1
            )
        )
    [gridUploadFiles_label] => Array (
        [0] => drawing.jpg
        [1] => drawing.png
        )
    [gridContestationAmount] => 100
    [gridContestationAmount_label] => 100
    [DA_PLATFORME] => XXXXXX
    [DA_PLATFORME_label] => XXXXXX
    [EAN] => 3257980158208
    [EAN_label] => 3257980158208
    [DESIGNATIONARTICLE] => ZZZZZZ
    [DESIGNATIONARTICLE_label] => ZZZZZZ
    [VA] => 00
    [VA_label] => 00
    [DPROMORPERM] => P
    [DPROMORPERM_label] => P
    [CODERUPTURECOMMANDE] => 06
    [CODERUPTURECOMMANDE_label] => 06
    [DATELIVR] => 04/12/09
    [DATELIVR_label] => 04/12/09
    [NOCDE] => 12336422
    [NOCDE_label] => 12336422
    [RELIQUAT] => 
    )
  )

1 Ответ

2 голосов
/ 05 апреля 2020

РЕДАКТИРОВАТЬ Мое недоразумение - вы работаете с ассоциативными массивами. Изначально мне это было непонятно.

Когда я проверяю ваш опубликованный код по следующему массиву:

$a = [
    'test' => 'a',
    'test2' => 'b',
    'test3' => 'c',
    'test_label' => 'd',
    'test_label_2' => [
        'test_label_3' => 'e',
        'test4' => [
            'test_label_4' => 'f'
        ]
    ]
];

Кажется, он делает то, что вы ожидаете.

OUTPUT:
Array (
     [test_label] => d
     [test_label_2] => Array (
          [test_label_3] => e
     )
)

Оригинальный ответ

Проблема связана с порядком параметров.

    if (($callback($v, $k))==false) {
        unset($array[$k]);
    }

В этом случае $v - это строка, а $k это индекс массива. Итак, ваш метод checkiflabel сравнивает индексы массива цифр c со строкой.

Решение состоит в том, чтобы просто изменить порядок, в котором вы вызываете метод.

    if (($callback($k, $v))==false) {
        unset($array[$k]);
    }

В качестве небольшого совета в будущем, когда вы столкнетесь с похожими проблемами: вы бы быстро заметили это, просто добавив var_dump к методу checkiflabel, чтобы убедиться, что параметры соответствуют ожидаемым! :)

...