PHP 操作数组问题

<?php
//////当前查询出来的数据
$redata = array(
    0=>['id'=>1,'name'=>'张三','age'=>22,'hobby'=>'学习'],
    1=>['id'=>1,'name'=>'张三','age'=>22,'hobby'=>'骑行'],
    2=>['id'=>2,'name'=>'李四','age'=>20,'hobby'=>'旅游'],
);

//怎么样才能转换成下面这种形式的?  写了一上午 愣是没写出来
$arr = array(
    0=>[
        'id'=>1,'name'=>'张三','age'=>22,'hobby'=> ['学习', '骑行']
    ],
    1=>[
        'id'=>2,'name'=>'李四','age'=>20,'hobby'=> ['旅游']
    ]
);

阅读 2.8k
5 个回答
$redata = array(
  0 => ['id' => 1, 'name' => '张三', 'age' => 22, 'hobby' => '学习'],
  1 => ['id' => 1, 'name' => '张三', 'age' => 22, 'hobby' => '骑行'],
  2 => ['id' => 2, 'name' => '李四', 'age' => 20, 'hobby' => '旅游'],
);

$result = array_reduce($redata, function ($arr, $item) {
  $key = array_search($item['id'], array_column($arr, 'id'));
  if ($key === false) {
    $item['hobby'] = [$item['hobby']];
    $arr[] = $item;
  } else {
    $arr[$key]['hobby'][] = $item['hobby'];
  }
  return $arr;
}, []);

var_dump($result);
$arr = [];
foreach($redata as $k=>$row){
    foreach($row as $key => $item){
        if($key === 'hobby'){
            $arr[$row['id']][$key][] = $item; 
        }else{
            $arr[$row['id']][$key] = $item; 
        }
        
        
    }
}

var_dump($arr);
$arr = [];
foreach($redata as $v){
    $arr[$v['id']]['id'] = $v['id'];
    $arr[$v['id']]['name'] = $v['name'];
    $arr[$v['id']]['age'] = $v['age'];
    $arr[$v['id']]['hobby'][] = $v['hobby'];
}
$idMap = array_column($arr,'id');
array_multisort($arr,SORT_ASC,$idMap);
var_dump($arr);

数组字段是固定的话 省去 if 判断的时间

clipboard.png

clipboard.png
代码
`
$redata = array(

0=>['id'=>1,'name'=>'张三','age'=>22,'hobby'=>'学习'],
1=>['id'=>1,'name'=>'张三','age'=>22,'hobby'=>'骑行'],
2=>['id'=>2,'name'=>'李四','age'=>20,'hobby'=>'旅游'],

);

function hebing($redata){

foreach ($redata as $k => $v) {
    if($redata[$k]['id']==$redata[$k+1]['id']){
        $redata[$k+1]['hobby'] = [$redata[$k]['hobby'],$redata[$k+1]['hobby']];
        array_splice($redata, $k, 1);
    }
}
return $redata;

}
var_dump(hebing($redata));
`

一个foreach还是好理解吧.

function hobby_merge($redata)
{
    $result = [];
    foreach($redata as $item) {
        if (!isset($result[$item['id']])) {
            $item['hobby'] = (array) $item['hobby'];
            $result[$item['id']] = $item;
            continue;
        }
        $result[$item['id']]['hobby'][] = $item['hobby'];
    }
    return array_values($result);
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题