合并相同键的数组值

时间:2016-11-21 12:27:45

标签: php arrays

我正在尝试构建一个用作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,因为我正在处理单个数组,这里没有其他答案帮助我。

如果您要将此问题标记为重复,请注意我在询问之前尝试了几个答案。他们都没有工作。

4 个答案:

答案 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
            )

    )
    */