从具有子数组的多维数组中删除最后两个元素

时间:2014-01-07 10:21:36

标签: php multidimensional-array

我有下面的多维数组,我想从子数组中删除最后两个元素(可能有任意数量的子数组)。

    $data=  Array
(
    [0] => Array
        (
            [rowdata] => Array
                (
                    [0] => Array
                        (
                            [DOELGROEP] => 2
                            [KANTOOR] => 2
                            [OBLIGOCATEGORIE] => 3
                            [] => Overall NPS
                            [0] => Array
                                (
                                    [1] => npsorg
                                    [3] => npsdetbe
                                )
                        )

                    [1] => Array
                        (
                            [DOELGROEP] => 2
                            [KANTOOR] => 2
                            [OBLIGOCATEGORIE] => 3
                            [] => Overall NPS
                            [0] => Array
                                (
                                    [1] => npsorg
                                    [3] => npsdetbe
                                )

                        )

                )

            [reason] => column values are not correct
        )

)

期望的输出:

$data=  Array
(
    [0] => Array
        (
            [rowdata] => Array
                (
                    [0] => Array
                        (
                            [DOELGROEP] => 2
                            [KANTOOR] => 2
                            [OBLIGOCATEGORIE] => 3

                        )

                    [1] => Array
                        (
                            [DOELGROEP] => 2
                            [KANTOOR] => 2
                            [OBLIGOCATEGORIE] => 3


                        )

                )

            [reason] => column values are not correct
        )

)

我的尝试:

unset ($data[count($data)-2]);

上面的代码没有工作,即它没有删除最后两个元素。我做错了什么?

提前致谢

8 个答案:

答案 0 :(得分:1)

unset($data[0]['rowdata'][0][0]);

答案 1 :(得分:1)

unset($data[0]['rowdata'][0]['ab'],$data[0]['rowdata'][0][0]);

答案 2 :(得分:1)

您的代码无效unset ($data[count($data)-2]);因为count($data)-2 = -1所以您的数组$ data没有键-1,$ data [-1]。 你需要按照你的数组示例$ data [0] ['rowdata'] [0] ['ab']。

如果您确定您将始终使用此数组“设计”。

   <?php
         $data = Array(
            0 => Array(
                'rowdata' => Array(
                    0 => Array
                        (
                            'DOELGROEP' => 2,
                            'KANTOOR' => 2,
                            'OBLIGOCATEGORIE' => 3,
                            0 => Array
                                (
                                    1 => 'npsorg',
                                    3 => 'npsdetbe'
                                )
                        ),
                    1 => Array
                        (
                            'DOELGROEP' => 2,
                            'KANTOOR' => 2,
                            'OBLIGOCATEGORIE' => 3,
                            0 => Array
                                (
                                    1 => 'npsorg',
                                    3 => 'npsdetbe'
                                )

                        )

                ),       
                    'reason' => 'column values are not correct'
                )
            );

 echo '<pre>';
echo '<h1>before</h1>';
        print_r($data);


    foreach($data[0]['rowdata'] as $k => $v){
       unset($data[0]['rowdata'][$k][0]);
    }

       echo '<h1>After</h1>';
        print_r($data);

         //unset($data[0]['rowdata'][0][0]);   
        // unset($data[0]['rowdata'][1][0]);   

<?php $data = Array( 0 => Array( 'rowdata' => Array( 0 => Array ( 'DOELGROEP' => 2, 'KANTOOR' => 2, 'OBLIGOCATEGORIE' => 3, 0 => Array ( 1 => 'npsorg', 3 => 'npsdetbe' ) ), 1 => Array ( 'DOELGROEP' => 2, 'KANTOOR' => 2, 'OBLIGOCATEGORIE' => 3, 0 => Array ( 1 => 'npsorg', 3 => 'npsdetbe' ) ) ), 'reason' => 'column values are not correct' ) ); echo '<pre>'; echo '<h1>before</h1>'; print_r($data); foreach($data[0]['rowdata'] as $k => $v){ unset($data[0]['rowdata'][$k][0]); } echo '<h1>After</h1>'; print_r($data); //unset($data[0]['rowdata'][0][0]); // unset($data[0]['rowdata'][1][0]);

更新: 你可以,

unset($data[0]['rowdata'][0][0]);
unset($data[0]['rowdata'][1][0]);

或者

unset($data[0]['rowdata'][0][0]); unset($data[0]['rowdata'][1][0]);

更新示例:example

答案 3 :(得分:1)

尝试创建自定义过滤器功能

function myFilter($val){
foreach($val as $key=>$val){
$len =  sizeof($val);   
  for($i=0;$i<$len;$i++){ 
     $val[$i] = array_splice($val[$i],0,-2);
  }
    }
 return $val;
}

然后调用array_map

$data = array_map('myFilter',$data);
print_r($data);
exit();

您可以看到更多信息here

答案 4 :(得分:1)

如您所知,您要从多维数组中删除元素,您必须达到该维度。之后,您需要拥有该阵列的所有键。您可以使用array_keys。你会得到一系列的钥匙。然后通过使用它可以取消设置数组的最后两个元素。你必须在循环中使用它。

你必须实现:

unset($data[0]['rowdata'][0]['ab']);
unset($data[0]['rowdata'][0][0]);

答案 5 :(得分:1)

您应该使用适用于非数字索引的结束函数。 这应该工作我认为:

for($i=0; $i<2; $i++){
    end($data[0]['rowdata'][0]);
    unset(key($data[0]['rowdata'][0]));
    reset($data[0]['rowdata'][0]);
}

答案 6 :(得分:1)

@Mrcoder同样的事情,除了你应该围绕一个foreach函数包装它来解析你的所有&#34; main&#34;阵列。

$toDel = 2;
foreach($data[0]['rowdata'] as $main){
    for($i=0; $i<toDel; $i++){
        end($main);
        unset(key($main));
        reset($main);
    }
}

答案 7 :(得分:1)

如果您想要保留的三个键是DOELGROEP,KANTOOR和OBLIGOCATEGORIE - 以下内容将起作用。

$keep_indexes = array('DOELGROEP', 'KANTOOR', 'OBLIGOCATEGORIE');

foreach($data[0]['rowdata'] as $key => $val) {
    if(!in_array($key, $keep_indexes)) { unset($data[0]['rowdata'][$key]; }
}

编辑,如果它不是特定于密钥而且它总是最后2列,请尝试:

foreach($data[0]['rowdata'] as $key => $val) {
    $i = 1;
    $count = count($data[0]['rowdata'][$key]);
    foreach($data[0]['rowdata'][$key] as $key2 => $val2) {
        if($i >= ($count - 2)) { unset($data[0]['rowdata'][$key][$key2]); }
        $i++;
    }
}