繁体   English   中英

合并相同键的数组值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM