我希望基于一系列产品创建一个独特的数组,例如:
$orderProducts = array (
array('name' => 'Series 101. Pure Red Sable', 'price' => 4),
array('name' => 'Series 101. Pure Red Sable', 'price' => 6),
array('name' => 'Series 101. Pure Red Sable', 'price' => 8),
array('name' => 'Series 101. Pure Red Sable', 'price' => 10),
array('name' => 'Series 101. Pure Red Sable', 'price' => 12),
array('name' => 'Series 222', 'price' => 5),
array('name' => 'Series 222', 'price' => 5),
array('name' => 'Series 1', 'price' => 7),
array('name' => 'Series 1', 'price' => 7),
);
目标是创建一个包含单个名称迭代的数组,以及它们的价格总和。 例如,所有101系列。纯红貂将是40。 然后,我想把它们放在一个新的独特数组中,如下所示:
$newProductsArray = array (
array('name' => 'Series 101. Pure Red Sable', 'price' => 40),
array('name' => 'Series 222', 'price' => 10),
array('name' => 'Series 1', 'price' => 14),
);
我使用的是PHP 5.4.12版,但我手动添加了 array_column 功能,并通过实验来实现我的目标,但没有成功。也许可以扩展功能以创建所需的结果?
function array_column($array,$column_name)
{
return array_map(function($element) use($column_name){return $element[$column_name];}, $array);
}
答案 0 :(得分:1)
简单foreach
会帮助你。
ini_set('display_errors', 1);
$orderProducts = array(
array('name' => 'Series 101. Pure Red Sable', 'price' => 4),
array('name' => 'Series 101. Pure Red Sable', 'price' => 6),
array('name' => 'Series 101. Pure Red Sable', 'price' => 8),
array('name' => 'Series 101. Pure Red Sable', 'price' => 10),
array('name' => 'Series 101. Pure Red Sable', 'price' => 12),
array('name' => 'Series 222', 'price' => 5),
array('name' => 'Series 222', 'price' => 5),
array('name' => 'Series 1', 'price' => 7),
array('name' => 'Series 1', 'price' => 7),
);
$result=array();
foreach($orderProducts as $value)
{
if(!isset($result[$value["name"]]))
{
$result[$value["name"]]=$value;
}
else
{
$result[$value["name"]]["price"]+=$value["price"];
}
}
print_r(array_values($result));
解决方案2:
$result=array();
array_map(function($value) use (&$result){
if(!isset($result[$value["name"]]))
{
$result[$value["name"]]=$value;
}
else
{
$result[$value["name"]]["price"]+=$value["price"];
}
}, $orderProducts);
print_r(array_values($result));