php合并多个数组 相同元素取交集 不同元素组成数组

PHP合并数组:取交集并按元素分组
该博客讨论了如何将PHP数组中具有相同'element1'的元素合并,保持相同键,'element2'值以数组形式存储。作者寻求高效的方法实现,包括了多个解决方案和讨论。

php合并多个数组 相同元素取交集 不同元素组成数组
渣哥 发布于 2014/01/23 22:00 阅读 3K+ 收藏 4 答案 10
PHP
求助:

数组格式是这样的:

$arr=array(
array(‘element1’=>‘a’,‘element2’=>1),
array(‘element1’=>‘b’,‘element2’=>2),
array(‘element1’=>‘a’,‘element2’=>2),
array(‘element1’=>‘b’,‘element2’=>3),
);

需要合成为:

$arr=array(
array(‘element1’=>‘a’,‘element2’=>array(1,2)),
array(‘element1’=>‘b’,‘element2’=>array(2,3)),
);

举报
0
渣哥
渣哥 2014/01/23 22:50
new=array();foreach(new = array(); foreach (new=array();foreach(arr as $key => $value) {
new[new[new[value[‘element1’]][] = $value[‘element2’];
}
new2=array();foreach(new2 = array(); foreach(new2=array();foreach(new as k=>k=>k=>v){
new2[]=array(′element1′=>new2[] = array('element1'=>new2[]=array(element1=>k,‘element2’=>KaTeX parse error: Expected 'EOF', got '}' at position 5: v); }̲ print_r(new2);

评论 (0) 引用此答案 举报
0
酒逍遥
酒逍遥 2014/01/24 08:39
自问自答?
评论 (0) 引用此答案 举报
0
练打字的
练打字的 2014/01/24 09:04
你这个效率啊…循环一次就够了,直接k操作,取值合并数组,完事…
评论 (0) 引用此答案 举报
0
渣哥
渣哥 2014/01/24 09:44
引用来自“cgf986916”的答案
你这个效率啊…循环一次就够了,直接k操作,取值合并数组,完事…
求更高效写法
评论 (0) 引用此答案 举报
0
tretretre0000000000
tretretre0000000000 2014/01/24 10:18
$new_array = array();
a=array();foreach(a = array(); foreach(a=array();foreach(arr as $key => KaTeX parse error: Expected '}', got 'EOF' at end of input: …{ if(!in_array(val[‘element1’],$a)){
$a[] = $val[‘element1’];
newarray[new_array[newarray[val[‘element1’]] = $val;
}else{
newarray[new_array[newarray[val[‘element1’]][‘element2’] = array_merge(array(newarray[new_array[newarray[val[‘element1’]][‘element2’]),array($val[‘element2’]));
}
}
newarray=arrayvalues(new_array = array_values(newarray=arrayvalues(new_array);
一次循环其实还真可以。无他,练手。

评论 (1) 引用此答案 举报
练打字的
练打字的 2014/01/24 11:36
你这个不错,但是可以改进
回复 举报
0
帖子列表
帖子列表 2014/01/24 10:20
$arr=array(
array(‘element1’=>‘a’,‘element2’=>1),
array(‘element1’=>‘b’,‘element2’=>2),
array(‘element1’=>‘a’,‘element2’=>2),
array(‘element1’=>‘b’,‘element2’=>3),
);

class timer
{
private $start_time = NULL;
private $end_time = NULL;

private function getmicrotime()
{
  list($usec, $sec) = explode(" ", microtime());
  return ((float)$usec + (float)$sec);
}

function start()
{
  $this->start_time = $this->getmicrotime();
}

function stop()
{
  $this->end_time = $this->getmicrotime();
}

function result()
{
    if (is_null($this->start_time))
    {
        exit('Timer: start method not called !');
        return false;
    }
    else if (is_null($this->end_time))
    {
        exit('Timer: stop method not called !');
        return false;
    }

    return round(($this->end_time - $this->start_time), 4);
}

# an alias of result function
function time()
{
    $this->result();
}

}
// @pxv 的方法0.0343秒
$timer = new timer();
$timer->start();
i=0;for(i = 0; for(i=0;for(i = 0; $i<10000; $i++){
$new_array = array();
a=array();foreach(a = array(); foreach(a=array();foreach(arr as $key => KaTeX parse error: Expected '}', got 'EOF' at end of input: …{ if(!in_array(val[‘element1’],$a)){
$a[] = $val[‘element1’];
newarray[new_array[newarray[val[‘element1’]] = $val;
}else{
newarray[new_array[newarray[val[‘element1’]][‘element2’] = array_merge(array(newarray[new_array[newarray[val[‘element1’]][‘element2’]),array($val[‘element2’]));
}
}
newarray=arrayvalues(new_array = array_values(newarray=arrayvalues(new_array);
}

$timer->stop();
echo $timer->result();

echo ‘|’;

// 我的方法0.0522秒
$timer = new timer();
$timer->start();
i=0;for(i = 0; for(i=0;for(i = 0; $i<10000; $i++){
arrCheck=arrayunique(arraymap(function(arrCheck = array_unique(array_map(function(arrCheck=arrayunique(arraymap(function(subArr){return $subArr[‘element1’];}, $arr));
arrResult=array();foreach(arrResult = array(); foreach(arrResult=array();foreach(arrCheck as $name){
tmp=array();foreach(tmp = array(); foreach(tmp=array();foreach(arr as KaTeX parse error: Expected '}', got 'EOF' at end of input: …r){ if(subArr[‘element1’] == $name){
$tmp[] = KaTeX parse error: Expected 'EOF', got '}' at position 29: …nt2']; }̲ } arra…arrResult, array(‘element1’ => $name, ‘element2’ => KaTeX parse error: Expected 'EOF', got '}' at position 8: tmp)); }̲ //var_dump(arrResult);
}
$timer->stop();
echo $timer->result();

echo ‘|’;

// 猴哥的方法0.0164秒
$timer = new timer();
$timer->start();
i=0;for(i = 0; for(i=0;for(i = 0; $i<10000; $i++){
new=array();foreach(new = array(); foreach (new=array();foreach(arr as $key => $value) {
new[new[new[value[‘element1’]][] = $value[‘element2’];
}
new2=array();foreach(new2 = array(); foreach(new2=array();foreach(new as k=>k=>k=>v){
new2[]=array(′element1′=>new2[] = array('element1'=>new2[]=array(element1=>k,‘element2’=>KaTeX parse error: Expected 'EOF', got '}' at position 5: v); }̲ //print_r(new2);
}
$timer->stop();
echo $timer->result();

练打字的 2014/01/24 11:38
引用来自“pxv”的答案
$new_array = array();
a=array();foreach(a = array(); foreach(a=array();foreach(arr as $key => KaTeX parse error: Expected '}', got 'EOF' at end of input: …{ if(!in_array(val[‘element1’],$a)){
$a[] = $val[‘element1’];
newarray[new_array[newarray[val[‘element1’]] = $val;
}else{
newarray[new_array[newarray[val[‘element1’]][‘element2’] = array_merge(array(newarray[new_array[newarray[val[‘element1’]][‘element2’]),array($val[‘element2’]));
}
}
newarray=arrayvalues(new_array = array_values(newarray=arrayvalues(new_array);
一次循环其实还真可以。无他,练手。

newarray=array();foreach(new_array = array(); foreach (newarray=array();foreach(arr as $key => KaTeX parse error: Expected '}', got 'EOF' at end of input: … isset(new_array[$val[‘element1’]])
? newarray[new_array[newarray[val[‘element1’]][‘element2’] = array_merge(array(newarray[new_array[newarray[val[‘element1’]][‘element2’]), array($val[‘element2’]))
: newarray[new_array[newarray[val[‘element1’]] = $val;
}
newarray=arrayvalues(new_array = array_values(newarray=arrayvalues(new_array);

https://www.oschina.net/question/244077_142022

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值