2016-11-21 173 views
0

我正在嘗試構建一個查詢字符串以用作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這裏幫助我。

如果您打算將此問題標記爲重複,請注意在詢問之前我已嘗試了幾個答案。他們都沒有工作。

+0

可能重複[php |數組合並](http://stackoverflow.com/questions/17336004/php-array-merge) –

+0

你想隱藏數組中的重複數據嗎? –

回答

2

採用單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

+0

謝謝Anant,現在工作正常。你的和@ jitendrapurohit的答案都在起作用。你能告訴我哪一個更快,資源更少嗎? – Abhik

+0

@Ahhik只有東西是其他人使用2'foreach()'(不需要),我使用了1(當大量數據來臨時速度更快)。所以當數據變大時只會造成時間問題,但數據應該非常大。 –

+0

感謝您的意見:) – Abhik

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

你可以做手工用一個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 
      ) 

    ) 
    */ 
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", 
    ], 
] 

你可能想繼續並implode值。

如果不使用Laravel,這裏是standalone package for Laravel's Collection類。安裝,只是composer require tightenco/collect的問題。你只是安裝一個包,而不是整個框架。

+0

laravel在他的帖子裏提到過任何地方嗎? –

+2

你說得對。但該解決方案不限於Laravel應用程序。這只是一個作曲家包。 – sepehr

+1

然而,我很樂意使用它來完成一項簡單的任務,使用該框架將會過度。 – Abhik