[英]Merge array values for same keys
我正在尝试建立一个查询字符串以用作Google字体选择。 字体名称和粗细将作为数组传递。
$fonts = array();
$fonts[] = array( 'family' => 'Lato', 'weight' => '400', );
$fonts[] = array( 'family' => 'Lato', 'weight' => '700i', );
$fonts[] = array( 'family' => 'Lato', 'weight' => '900', );
$fonts[] = array( 'family' => 'Open Sans', 'weight' => '400', );
$fonts[] = array( 'family' => 'Open Sans', 'weight' => '700', );
$fonts[] = array( 'family' => 'Open Sans', 'weight' => '800', );
$fonts[] = array( 'family' => 'Ubuntu', 'weight' => '400', );
$fonts[] = array( 'family' => 'Ubuntu', 'weight' => '500', );
$fonts[] = array( 'family' => 'Ubuntu', 'weight' => '7i00', );
如果字体家族相同,如何合并粗细? 这样就变成这样?
Array
(
[Lato] => 400,700i,900
[Open+Sans] => 400,700,800
[Ubuntu] => 400,500,700i
)
我不能使用array_merge_recursive
因为我正在处理单个数组,这里的其他答案都没有帮助我。
如果您要将这个问题标记为重复,请注意,在询问之前我已经尝试了多个答案。 他们都没有工作。
使用两个foreach
语句来达到此目的
$newArr = array();
//make an array values for each family
foreach ($fonts as $val) {
$newArr[$val['family']][] = $val['weight'];
}
//using implode join the array values
foreach ($newArr as &$val) {
$val = implode(', ', $val);
}
var_dump($newArr); // would be the required array
使用单个foreach()
您可以像下面这样实现它:
$new_array = array();
foreach ($fonts as $font){
$new_value = !empty($new_array[$font['family']]) ? $new_array[$font['family']].','.$font['weight'] : $font['weight'];
$new_array[$font['family']] = $new_value;
}
echo "<pre/>";print_r($new_array);
输出: -https : //eval.in/681838
当然,还有其他人已经提到过的香草PHP解决方案,但是我会去Laravel的Collection
类。
但是,这不仅限于Laravel应用程序,您只需安装一个作曲家软件包,除了解决此特定问题外,它还为您的应用程序带来很多好处,并为您提供了一些有用的工具。 让我们来看看:
collect($fonts)
->groupBy('family')
->map(function($item, $key) {
return $item->pluck('weight');
})
->toArray();
就如此容易。 这是输出:
[
"Lato" => [
"400",
"700i",
"900",
],
"Open Sans" => [
"400",
"700",
"800",
],
"Ubuntu" => [
"400",
"500",
"7i00",
],
]
您可能想要继续并内含这些值。
如果不使用Laravel,这是Laravel的Collection
类的独立软件包 。 安装,仅是composer require tightenco/collect
; 您只是安装一个软件包,而不是整个框架。
您可以使用一个foreach
语句手动进行操作。
function mergeFonts($fonts)
{
$result = array();
foreach ($fonts as $font) {
if (array_key_exists($font['family'], $result)) {
array_push($result[$font['family']], $font['weight']);
} else {
$result[$font['family']] = array($font['weight']);
}
}
return $result;
}
和:
$fonts = array();
$fonts[] = array( 'family' => 'Lato', 'weight' => '400', );
$fonts[] = array( 'family' => 'Lato', 'weight' => '700i', );
$fonts[] = array( 'family' => 'Lato', 'weight' => '900', );
$fonts[] = array( 'family' => 'Open Sans', 'weight' => '400', );
$fonts[] = array( 'family' => 'Open Sans', 'weight' => '700', );
$fonts[] = array( 'family' => 'Open Sans', 'weight' => '800', );
$fonts[] = array( 'family' => 'Ubuntu', 'weight' => '400', );
$fonts[] = array( 'family' => 'Ubuntu', 'weight' => '500', );
$fonts[] = array( 'family' => 'Ubuntu', 'weight' => '7i00', );
echo '<pre>';
print_r(mergeFonts($fonts));
/* The output:
Array
(
[Lato] => Array
(
[0] => 400
[1] => 700i
[2] => 900
)
[Open Sans] => Array
(
[0] => 400
[1] => 700
[2] => 800
)
[Ubuntu] => Array
(
[0] => 400
[1] => 500
[2] => 7i00
)
)
*/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.