我正在尝试构建一个用作Google字体选择的查询字符串。 fontname和weight将作为数组传递。
$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
,因为我正在处理单个数组,这里没有其他答案帮助我。
如果您要将此问题标记为重复,请注意我在询问之前尝试了几个答案。他们都没有工作。
答案 0 :(得分:3)
使用两个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
答案 1 :(得分:2)
使用单个$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);
,您可以像下面这样实现: -
<a>
<b>
<c>
<d>
<e>
</b>
<f>
<g>
</f>
</a>
输出: - https://eval.in/681838
答案 2 :(得分:2)
当然,正如其他人已经提到的那样,有一些普通的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,这里是standalone package for Laravel's Collection
课程。安装,只是composer require tightenco/collect
的问题。你只是安装一个软件包,而不是整个框架。
答案 3 :(得分:1)
您可以手动使用一个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
)
)
*/