Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP删除所有数组项_Php_Arrays_Multidimensional Array - Fatal编程技术网

PHP删除所有数组项

PHP删除所有数组项,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,有人能帮我理解和修复吗;为什么下面的代码正在清除数组中的所有项。 代码旨在递归删除数组中键中没有“\u标签”的所有项 function checkiflabel($item,$key){ if(strpos($key,'_label')!==false) return true; else return false; } function walk_recursive_remove (array $array, callable $callback)

有人能帮我理解和修复吗;为什么下面的代码正在清除数组中的所有项。 代码旨在递归删除数组中键中没有“\u标签”的所有项

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) 

它会删除所有带有_标签的项目,其余项目都可以。 下面是$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] => 
    )
  )

编辑我的误解-您正在使用关联数组。我起初并不清楚这一点

当我针对以下数组测试发布的代码时:

$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){
未设置($array[$k]);
}
在本例中,
$v
是字符串,
$k
是数组索引。因此,您的
checkiLabel
方法将数字数组索引与字符串进行比较

解决方案只是颠倒调用方法的顺序

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

作为一个小提示,将来当您遇到类似问题时:只需向
checkiLabel
方法添加一个
var_dump
,您就会很快注意到这一点,以确保参数与您预期的一样!:)

编辑我的误解-您正在使用关联数组。我起初并不清楚这一点

当我针对以下数组测试发布的代码时:

$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){
未设置($array[$k]);
}
在本例中,
$v
是字符串,
$k
是数组索引。因此,您的
checkiLabel
方法将数字数组索引与字符串进行比较

解决方案只是颠倒调用方法的顺序

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

作为一个小提示,将来当您遇到类似问题时:只需向
checkiLabel
方法添加一个
var_dump
,您就会很快注意到这一点,以确保参数与您预期的一样!:)

你好。请编辑您的问题并概述代码的含义谢谢!编辑它,希望它解释得更好!再次感谢您的编辑,我再次编辑它是为了提供一个更好的示例,并像您一样美化了阵列。您好。请编辑您的问题并概述代码的含义谢谢!编辑它,希望它解释得更好!再次感谢您的编辑,我再次编辑它是为了提供一个更好的示例,并像您一样美化了数组。非常感谢您的快速回复,请您重新检查一下,我在原始问题中添加了我的数组的打印转储。@user13229327似乎我误解了您的原始问题。请参阅我的编辑。你能澄清问题是什么吗?谢谢!您的理解是正确的,我已经用_标签键精确转储了数组,对我来说,相同的代码给出了一个空数组,对我来说没有意义。我不知道出了什么问题。@user13229327您使用的是什么版本的PHP?PHP版本是7.1.33非常感谢您的快速回复,请您重新检查一下,我在原始问题中添加了数组的打印转储。@user13229327似乎我误解了您的原始问题。请参阅我的编辑。你能澄清问题是什么吗?谢谢!您的理解是正确的,我已经用_标签键精确转储了数组,对我来说,相同的代码给出了一个空数组,对我来说没有意义。我不知道出了什么问题。@user13229327您使用的是什么版本的PHP?PHP版本是7.1.33