2016-02-28 2 views
1

Я ищу простое решение для создания немного функции, чтобы объединить два массива со значением CONCAT (я использую его для создания HTML атрибута тега):Как объединить два массива и Concat значения с PHP

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

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

результат:

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

и еще один вариант: если $new не является массивом, просто CONCAT с $default["class"] (если это существует), а другая сторона: если $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

Спасибо. Ваша функция отлично работает с атрибутом класса, но очищает '$ default [" style "]' и оставляет только значение '$ new [" style "]'. – rastafest

+0

Я добавил исправление. Я не знал, что вы можете передать стиль как значение по умолчанию, как класс – Nick

+0

Извините, я смущен в конце :) Эта функция отлично работает для меня. Благодаря!:) – rastafest

0

Способ Я считаю, удовлетворяет Вашей потребности, мы надеемся, что это, как адаптируются и эффективна, как вы ожидали.

$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, которая проверяет, является ли она массивом, иначе она использует ее как строку и добавляет ее в класс. Как и ваша функция. –

+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); 
Смежные вопросы