按值合并单个数组对象并在子数组中保留重复项
Merge single array objects by value and preserve duplicates in sub array
我有以下(简化的)数组:
$myArray = array(
0=> array(
'userid' => '12',
'favcolor' => 'green'
),
1=> array(
'userid' => '62',
'favcolor' => 'orange'
),
2=> array(
'userid' => '12',
'favcolor' => 'red'
),
3=> array(
'userid' => '62',
'favcolor' => 'blue'
),
)
我想通过存在的公共用户标识值合并数组并保留最喜欢的颜色信息。我试过的其他方法只保留数组中的第一个 favcolor 值。看起来很简单,但无法找到快速解决方案。
预期输出:
$myArray = array(
0=> array(
'userid' => '12',
'favcolor' => array('green', 'red')
),
1=> array(
'userid' => '62',
'favcolor' => array('orange', 'blue')
),
)
如果不使用另一个数组进行比较,这可能吗?
这里我们使用简单的foreach
来合并并达到预期的结果,通过使用这个数组的userid
作为key
。这里我们使用 array_values
来删除那些密钥。
<?php
ini_set('display_errors', 1);
$myArray = array(
0=> array(
'userid' => '12',
'favcolor' => 'green'
),
1=> array(
'userid' => '62',
'favcolor' => 'orange'
),
2=> array(
'userid' => '12',
'favcolor' => 'red'
),
3=> array(
'userid' => '62',
'favcolor' => 'blue'
),
);
$result=array();
foreach($myArray as $value)
{
//check for previous existence of key in resultant array
//if key not exist then put value on that key and using favcolor as array
if(!isset($result[$value["userid"]]))of key in a array.
{
$result[$value["userid"]]=array("userid"=>$value["userid"],"favcolor"=>array($value["favcolor"]));
}
//if key already exists then just adding favcolor values to that key
else
{
$result[$value["userid"]]["favcolor"][]=$value["favcolor"];
}
}
print_r(array_values($result));
输出:
Array
(
[0] => Array
(
[userid] => 12
[favcolor] => Array
(
[0] => green
[1] => red
)
)
[1] => Array
(
[userid] => 62
[favcolor] => Array
(
[0] => orange
[1] => blue
)
)
)
只需按如下操作即可
// Creating an array for result
foreach($myArray as $ar){
if(!isset($aa[$ar['userid']])) $aa[$ar['userid']] = [];
if(!in_array($ar['favcolor'],$aa[$ar['userid']])) $aa[$ar['userid']][] = $ar['favcolor'];
}
// Designing it according to result
foreach($aa as $arr=>$val)
$last[] = ['userid'=>$arr,'favcolor'=>$val];
echo '<pre>';
var_dump($last);
我有以下(简化的)数组:
$myArray = array(
0=> array(
'userid' => '12',
'favcolor' => 'green'
),
1=> array(
'userid' => '62',
'favcolor' => 'orange'
),
2=> array(
'userid' => '12',
'favcolor' => 'red'
),
3=> array(
'userid' => '62',
'favcolor' => 'blue'
),
)
我想通过存在的公共用户标识值合并数组并保留最喜欢的颜色信息。我试过的其他方法只保留数组中的第一个 favcolor 值。看起来很简单,但无法找到快速解决方案。
预期输出:
$myArray = array(
0=> array(
'userid' => '12',
'favcolor' => array('green', 'red')
),
1=> array(
'userid' => '62',
'favcolor' => array('orange', 'blue')
),
)
如果不使用另一个数组进行比较,这可能吗?
这里我们使用简单的foreach
来合并并达到预期的结果,通过使用这个数组的userid
作为key
。这里我们使用 array_values
来删除那些密钥。
<?php
ini_set('display_errors', 1);
$myArray = array(
0=> array(
'userid' => '12',
'favcolor' => 'green'
),
1=> array(
'userid' => '62',
'favcolor' => 'orange'
),
2=> array(
'userid' => '12',
'favcolor' => 'red'
),
3=> array(
'userid' => '62',
'favcolor' => 'blue'
),
);
$result=array();
foreach($myArray as $value)
{
//check for previous existence of key in resultant array
//if key not exist then put value on that key and using favcolor as array
if(!isset($result[$value["userid"]]))of key in a array.
{
$result[$value["userid"]]=array("userid"=>$value["userid"],"favcolor"=>array($value["favcolor"]));
}
//if key already exists then just adding favcolor values to that key
else
{
$result[$value["userid"]]["favcolor"][]=$value["favcolor"];
}
}
print_r(array_values($result));
输出:
Array
(
[0] => Array
(
[userid] => 12
[favcolor] => Array
(
[0] => green
[1] => red
)
)
[1] => Array
(
[userid] => 62
[favcolor] => Array
(
[0] => orange
[1] => blue
)
)
)
只需按如下操作即可
// Creating an array for result
foreach($myArray as $ar){
if(!isset($aa[$ar['userid']])) $aa[$ar['userid']] = [];
if(!in_array($ar['favcolor'],$aa[$ar['userid']])) $aa[$ar['userid']][] = $ar['favcolor'];
}
// Designing it according to result
foreach($aa as $arr=>$val)
$last[] = ['userid'=>$arr,'favcolor'=>$val];
echo '<pre>';
var_dump($last);