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
n
e
w
=
a
r
r
a
y
(
)
;
f
o
r
e
a
c
h
(
new = array(); foreach (
new=array();foreach(arr as $key => $value) {
n
e
w
[
new[
new[value[‘element1’]][] = $value[‘element2’];
}
n
e
w
2
=
a
r
r
a
y
(
)
;
f
o
r
e
a
c
h
(
new2 = array(); foreach(
new2=array();foreach(new as
k
=
>
k=>
k=>v){
n
e
w
2
[
]
=
a
r
r
a
y
(
′
e
l
e
m
e
n
t
1
′
=
>
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
=
a
r
r
a
y
(
)
;
f
o
r
e
a
c
h
(
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’];
n
e
w
a
r
r
a
y
[
new_array[
newarray[val[‘element1’]] = $val;
}else{
n
e
w
a
r
r
a
y
[
new_array[
newarray[val[‘element1’]][‘element2’] = array_merge(array(
n
e
w
a
r
r
a
y
[
new_array[
newarray[val[‘element1’]][‘element2’]),array($val[‘element2’]));
}
}
n
e
w
a
r
r
a
y
=
a
r
r
a
y
v
a
l
u
e
s
(
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
;
f
o
r
(
i = 0; for(
i=0;for(i = 0; $i<10000; $i++){
$new_array = array();
a
=
a
r
r
a
y
(
)
;
f
o
r
e
a
c
h
(
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’];
n
e
w
a
r
r
a
y
[
new_array[
newarray[val[‘element1’]] = $val;
}else{
n
e
w
a
r
r
a
y
[
new_array[
newarray[val[‘element1’]][‘element2’] = array_merge(array(
n
e
w
a
r
r
a
y
[
new_array[
newarray[val[‘element1’]][‘element2’]),array($val[‘element2’]));
}
}
n
e
w
a
r
r
a
y
=
a
r
r
a
y
v
a
l
u
e
s
(
new_array = array_values(
newarray=arrayvalues(new_array);
}
$timer->stop();
echo $timer->result();
echo ‘|’;
// 我的方法0.0522秒
$timer = new timer();
$timer->start();
i
=
0
;
f
o
r
(
i = 0; for(
i=0;for(i = 0; $i<10000; $i++){
a
r
r
C
h
e
c
k
=
a
r
r
a
y
u
n
i
q
u
e
(
a
r
r
a
y
m
a
p
(
f
u
n
c
t
i
o
n
(
arrCheck = array_unique(array_map(function(
arrCheck=arrayunique(arraymap(function(subArr){return $subArr[‘element1’];}, $arr));
a
r
r
R
e
s
u
l
t
=
a
r
r
a
y
(
)
;
f
o
r
e
a
c
h
(
arrResult = array(); foreach(
arrResult=array();foreach(arrCheck as $name){
t
m
p
=
a
r
r
a
y
(
)
;
f
o
r
e
a
c
h
(
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
;
f
o
r
(
i = 0; for(
i=0;for(i = 0; $i<10000; $i++){
n
e
w
=
a
r
r
a
y
(
)
;
f
o
r
e
a
c
h
(
new = array(); foreach (
new=array();foreach(arr as $key => $value) {
n
e
w
[
new[
new[value[‘element1’]][] = $value[‘element2’];
}
n
e
w
2
=
a
r
r
a
y
(
)
;
f
o
r
e
a
c
h
(
new2 = array(); foreach(
new2=array();foreach(new as
k
=
>
k=>
k=>v){
n
e
w
2
[
]
=
a
r
r
a
y
(
′
e
l
e
m
e
n
t
1
′
=
>
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
=
a
r
r
a
y
(
)
;
f
o
r
e
a
c
h
(
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’];
n
e
w
a
r
r
a
y
[
new_array[
newarray[val[‘element1’]] = $val;
}else{
n
e
w
a
r
r
a
y
[
new_array[
newarray[val[‘element1’]][‘element2’] = array_merge(array(
n
e
w
a
r
r
a
y
[
new_array[
newarray[val[‘element1’]][‘element2’]),array($val[‘element2’]));
}
}
n
e
w
a
r
r
a
y
=
a
r
r
a
y
v
a
l
u
e
s
(
new_array = array_values(
newarray=arrayvalues(new_array);
一次循环其实还真可以。无他,练手。
n
e
w
a
r
r
a
y
=
a
r
r
a
y
(
)
;
f
o
r
e
a
c
h
(
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’]])
?
n
e
w
a
r
r
a
y
[
new_array[
newarray[val[‘element1’]][‘element2’] = array_merge(array(
n
e
w
a
r
r
a
y
[
new_array[
newarray[val[‘element1’]][‘element2’]), array($val[‘element2’]))
:
n
e
w
a
r
r
a
y
[
new_array[
newarray[val[‘element1’]] = $val;
}
n
e
w
a
r
r
a
y
=
a
r
r
a
y
v
a
l
u
e
s
(
new_array = array_values(
newarray=arrayvalues(new_array);
https://www.oschina.net/question/244077_142022