如何去除数组中的数据

发布于 2022-08-25 01:34:15 字数 1299 浏览 7 评论 0

  1. 大家看这个代码
        array (
          'cid' => '9',
          'pid' => '1',
        ),
        2 => 
        array (
          'cid' => '8',
          'pid' => '1',
        ),
        3 => 
        array (
          'cid' => '6',
          'pid' => '1',
        ),
        4 => 
        array (
          'cid' => '4',
          'pid' => '1',
        ),
        5 => 
        array (
          'cid' => '11',
          'pid' => '1',
        ),
      ),
      2 => 
      array (
        0 => 
        array (
          'cid' => '7',
          'pid' => '2',
        ),
      ),
      3 => 
      array (
        0 => 
        array (
          'cid' => '5',
          'pid' => '3',
        ),
      ),
    )

我用下面的方法取出cids

    foreach($data as $k=>$v){
        $c[$k]=$v;
        foreach($c[$k] as $d){
            $cids[]=$d['cid'];
        }
    }   

得到结果

array (
  0 => '1',
  1 => '2',
  2 => '3',
  3 => '10',
  4 => '9',
  5 => '8',
  6 => '6',
  7 => '4',
  8 => '11',
  9 => '7',
  10 => '5',
)

这里是取到的所有cid,我只想取出pid不等于0的cid,如何取出呢?请指点,谢谢 了

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

笙痞 2022-09-01 01:34:15

其实循环就可以了,能解决问题就挺好的嘛~不过感觉用多重循环太不awesome了,所以就稍微修改了一下~

$res = array();
function fliter($item, $key) {
    global $res;
    if($item['pid'] != 0) $res[] = $item['cid'];
}
foreach($data as $item) array_walk($item, 'fliter');
梦忆晨望 2022-09-01 01:34:15

据说用循环不 awesome ..?

那我来继续稍微修改一下让程序更 awesome 一些好了 ...

<?php
/* your original array ... */
$arr = [ 
    1 => [
        1 => [ 'cid' => '9', 'pid' => '1' ],
        2 => [ 'cid' => '8', 'pid' => '1' ],
        3 => [ 'cid' => '6', 'pid' => '1' ],
        4 => [ 'cid' => '4', 'pid' => '1' ],
        5 => [ 'cid' => '11', 'pid' => '1' ]
        ],
    2 => [ [ 'cid' => '7', 'pid' => '2' ] ],
    3 => [ [ 'cid' => '5', 'pid' => '3' ] ]
    ];

/* initialize a new array to save result ... */
$result = [];

/* single array_walk_recursive to finish job ... */
array_walk_recursive( $arr, function( $item, $key ) use ( &$result ) {

    /* different key ... different operation ...*/
    switch ( $key ) {

        /* push all the 'cid' into result ... */
        case 'cid':
            return $result[] = $item;

        /* undo last push if 'pid' equals to zero ... */
        case 'pid':
            if ( '0' === $item ) array_pop( $result );
    }

} );

/* show the result out ... */
var_export( $result );

其实我个人觉得这个问题的解决方案应该是先 array_map() 取值再用 array_filter() 过滤 ...

或者直接做 array_reduce() ... 因为原数组不仅改变了格式而且改变了大小 ...

不过既然楼上的宝二爷用了 array_walk() ... 我也写一个完全不用循环的类似实现好了 ...

这种实现方法的优点不考虑数组的维度 ... 多高维度的数组都可以处理 ...

缺点是每个小数组都要保证 cidpid 成对出现 ... 而且 cid 需要永远在 pid 前面 ...

其实我就是来凑热闹的 ... 恩恩就是这样啦 ...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文