РЕДАКТИРОВАТЬ Мое недоразумение - вы работаете с ассоциативными массивами. Изначально мне это было непонятно.
Когда я проверяю ваш опубликованный код по следующему массиву:
$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
, чтобы убедиться, что параметры соответствуют ожидаемым! :)