PHP数组问题

现在有一个二维数组是这样的:

$arr = array (
    array (  'menuid' => 1, 'nametitle' => '积分配置' ),
    array (  'menuid' => 1 ,'nametitle' => '关键词维护' ),
    array (  'menuid' => 2, 'nametitle' => '图文素材' ) ,
    array ( 'menuid' => 2, 'nametitle' => '关注回复' ),
    array (  'menuid' => 2, 'nametitle' => '智能回复' ),
    array ( 'menuid' => 2 ,'nametitle' => '自定义回复 '),
    array ( 'menuid' => 2, 'nametitle' => '粉丝管理 ')
);

想要获得一个新的数组是这样的:

$new_arr = array(
    array(
       0=>'积分配置',
       2=>'关键词维护',
    ),
    array(
       0=>'图文素材',
       1=>'关注回复',
       2=>'智能回复',
       3=>'粉丝回复',
    )
)

也就是按照menuid重新组合一个二维数组。
各位有什么好的办法?不能用遍历哦!或者说,除了遍历还有没有其他办法

---update---
有人说我只是想让人帮写代码,也是醉了,本来这题是我帮别人问的,他要求是不能用for或者foreach,考虑到集思广益,也就没说,我自己也想出了几种循环的方法,上来提问只是想看看是否有其他更好方法而已,可能是我表达不好吧~
下面有回答说sf是帮人解决bug的,不是帮人做作业的。难道bug就不可能是作业?难道我提这样的问题想看看更多的解决方法就是写作业?还真有点不可理喻耶~

阅读 5k
7 个回答

你最开始的问题肯定问错了。不遍历是不可能的。你总得审查每一个元素对吧。

后来的问题,不用forforeach,钻这个空子还不简单?

利用数组内置函数,见不到for也能搞遍历是分分钟的事情:

$r = [];
array_walk($arr, function ($item, $key) use (&$r) { // 实际上这一行等效于: foreach ($arr as $item)
    $r[$item['menuid']][] = $item['nametitle'];
});
ksort($r); // 排序数组的key,加这个可以应对menuid不按顺序出现的情况
$r = array_slice($r, 0); // 将数组的key全部消灭并还原为0...n-1,这是你题目预期结果的要求

题主就是偷懒想让别人帮他写代码233333。。。
我没从这个题目里看出任何难度或者有争议或者很复杂的地方。。。
不会数组遍历?百度啊。
不会创建数组?百度啊。
http://segmentfault.com是帮你搞定BUG,讨论有争议的问题的地方。。。
不是帮你写作业的地方。。。
题主就是懒。。。

遍历吧,一维数组貌似还可以array_keys和array_values获取

//修改
foreach($arr as $key => $subarr){
    foreach($subarr as $v){
        $new_arr[$subarr['menuid']][$key] = $subarr['nametitle'];
    }
}

foreach($new_arr as $key => $subarr){
    $new_arr[$key] = array_merge($subarr);
}

顶楼上,原理自己想。

array_map和array_walk本质上也是遍历数组并将回调函数应用到数组的每个元素上.
我还是习惯用foreach:

<?php
header('Content-Type: text/plain;charset=utf-8');
$arr = array (
    array ( 'menuid' => 1, 'nametitle' => '积分配置'  ),
    array ( 'menuid' => 1, 'nametitle' => '关键词维护'),
    array ( 'menuid' => 2, 'nametitle' => '图文素材'  ),
    array ( 'menuid' => 2, 'nametitle' => '关注回复'  ),
    array ( 'menuid' => 2, 'nametitle' => '智能回复'  ),
    array ( 'menuid' => 2 ,'nametitle' => '自定义回复'),
    array ( 'menuid' => 2, 'nametitle' => '粉丝管理'  )
);
foreach($arr as $v) {
    $new[$v['menuid']][] = $v['nametitle'];
}
print_r($new);
//输出
Array
(
    [1] => Array
        (
            [0] => 积分配置
            [1] => 关键词维护
        )

    [2] => Array
        (
            [0] => 图文素材
            [1] => 关注回复
            [2] => 智能回复
            [3] => 自定义回复
            [4] => 粉丝管理
        )
)
新手上路,请多包涵

$arr = array_column($arr, 'nametitle');
$new_arr = [array_slice($arr,0,2),array_slice($arr,2)];

$arr = array_column($arr, 'nametitle');
$new_arr = [array_slice($arr,0,2),array_slice($arr,2)];
这个不明白,数据量大、或者数据杂乱无章的时候呢。。。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题