2016-02-28 100 views
1

我正在尋找一個簡單的解決方案來創建一個小的功能合併兩個數組與值的concat Concat的值(我使用它來創建HTML標記屬性):如何合併兩個數組與PHP

$default["class"] = "red"; 

$new["class"] = "green"; 
$new["style"] = "display:block" 

其結果是:

$res["class"] = "red green"; 
$res["style"] = "display: block"; 

和一個選擇: 如果$new不是數組,只是用$default["class"]的concat(如果這存在),而另一側:如果$default是一個簡單的字符串,轉換爲數組:$default["class"] = $default;

我創建了一個功能,但想用一種更簡單,更短的方式爲:

function attrMerge($default, $new=""){ 
    $res = array(); 

    if(!is_array($default)) { 
     $res["class"] = $default; 
    } 
    else { 
     $res = $default; 
    } 

    if($new !== ""){ 
     if(!is_array($new)) { 
      if(isset($res["class"])){ 
       $res["class"].= " ".$new; 
      } 
     } 
     else { 
      foreach($new as $key=>$value) { 
       if(isset($res[$key])) { 
        $res[$key].= " ".$value; 
       } 
       else { 
        $res[$key] = $value; 
       } 
      } 
     } 
    } 

    return $res; 
} 

$a = attrMerge("red", array("class"=>"green", "style"=>"display: block;")); 

回答

1

我認爲這是你需要的功能。我已經初始化CSS類和風格爲空,在取決於你傳遞什麼到功能,那麼你得到的相關陣列

/** 
* This function returns an array of classes and styles 
* 
* @param $default 
* @param $new 
* @return array 
*/ 
function attrMerge($default=null, $new=nul) 
{ 
    $result = array(); 
    $result['class'] = ""; 
    $result['style'] = ""; 

    // add default class if exists 
    if (!empty($default) && is_string($default)) { 
     // $default is string 
     $result['class'] = $default; 
    } 
    if (!empty($default) 
     && is_array($default) 
    ) { 
     if (array_key_exists('class', $default) 
      && !empty($default['class']) 
     ) { 
      // $default['class'] exists and it's not empty 
      $result['class'] = $default['class']; 
     } 
     if (array_key_exists('style', $default) 
      && !empty($default['style']) 
     ) { 
      // $default['style'] exists and it's not empty 
      $result['style'] = $default['style']; 
     } 
    } 

    // add additional classes OR styles 
    if (!empty($new)) { 
     if(!is_array($new)) { 
      $result['class'] = empty($result['class']) 
       ? $new 
       : $result['class'] . " " . $new; 
     } else { 
      foreach ($new as $key => $value) { 
       if (isset($result[$key])) { 
        $result[$key] = empty($result[$key]) 
         ? $value 
         : $result[$key] . " " . $value; 
       } else { 
        $result[$key] = $value; 
       } 
      } 
     } 
    } 

    return $result; 
} 
+0

謝謝。你的函數可以很好的使用class屬性,但是清除'$ default [「style」]'並且只保留'$ new [「style」]'值。 – rastafest

+0

我加了修正。我不知道你可以像默認值一樣將類型傳遞給類 – Nick

+0

對不起,我在最後感到困惑:)這個函數對我很好。謝謝!:) – rastafest

0

一種方法,我認爲適合你的需要,希望這是爲適應和effecient如您所期望。

$array1 = array(
'class' => 'class1', 
'style' => 'display: none;' 
); 

$array2 = array(
    'class' => 'class2' 
); 

$arrayFinal = arrayMerge($array1, $array2); 
var_dump($arrayFinal); 

function arrayMerge($arr1, $arr2 = ''){ 
    // Array of attributes to be concatenated // 
    $attrs = array('class'); 
    if(is_array($arr2)){ 
     foreach($attrs as $attr){ 
      if(isset($arr1[$attr]) && isset($arr2[$attr])){ 
      // Not using .= to allow for smart trim (meaning empty check etc isn't needed // 
      $arr1[$attr] = trim($arr1[$attr] . ' ' . $arr2[$attr]); 
      } 
     } 
    }else{ 
     $arr1['class'] = trim($arr1['class'] . ' ' . $arr2); 
    } 

    return $arr1; 
} 
+0

感謝。但是這個函數在數組收入的時候起作用。有一個選項:這些變量是簡單的字符串而不是數組。我不想每次都把它們放入數組中。 – rastafest

+0

有一個if語句來檢查它是否是一個數組,否則它將它用作字符串並將其添加到「class」中。就像你的功能一樣。 –

+0

另外,我添加了一個數組($ attrs),所以你可以選擇添加什麼。例如,顯示不會被添加/連接。只有班級,因爲班級在$ attrs。 –

0
$def = ['class' => 'red']; 
$new = ['class' => 'green', 'style' => 'style']; 

function to_array($in) { 
    return is_array($in) ? $in : ['class' => $in]; 
} 

$def = to_array($def); 
$new = to_array($new); 

$res = $def; 
array_walk($new, function ($val, $key) use (&$res) { 
    $res[$key] = trim(@$res[$key] . ' ' . $val); 
}); 

var_dump($res);