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

被折叠的 条评论
为什么被折叠?



