Добавить массив с тем же значением

#php #arrays

#php #массивы

Вопрос:

Мне нужна помощь или совет о том, как добавить или объединить значение массива с тем же ключом.

Например:

 Array(
    [price] => 123
    [category] => Fiction
    [bookname] => Any-Book
    [type] => Futuristic 
)
Array (
    [price] => 145
    [category] => Fantasy
    [bookname] => Any-Book
    [type] => Futuristic
)
  

После многих попыток я не смог добиться желаемого результата
, который должен быть:

 Array (
    [price] => 268
    [category] => Fantasy/Fiction
    [bookname] => Any-book
    [type] => Futuristic
)
  

Мне просто нужно объединить два, они по сути одно и то же или должны быть объединены.

Комментарии:

1. Что такое тот же ключ? bookname? Что делать, если типы разные?

2. переключать регистры в зависимости от типа элемента 2

3. Будет ли когда-нибудь более двух массивов для объединения? Будут ли когда-нибудь другие пары ключ / значение?

Ответ №1:

Вы должны быть уверены в типе ваших массивов и в том, что они имеют одинаковые ключи :

  <?php
$a = array('price' => 123,
     'category' => 'Fiction',
     'bookname' =>'Any-book', 
     'type' => 'Futuristic');

      $b = array('price' => 145,
     'category' => 'Fantasy',
     'bookname' =>'Any-book', 
     'type' => 'Futuristic');



function mergeSameArray(array $a, array $b){
    $c = array();
    foreach($a as $key => $valueA){
        $typeA = gettype($valueA);
        $typeB = gettype($b[$key]); //$valueB
        if($typeB == $typeA){
            if($typeB == "double" || $typeA == "integer"){
                $c[$key] = $valueA  $b[$key];
            }
            elseif($typeB == "string"){
                if($valueA == $b[$key]){
                    $c[$key] = $valueA;
                }
                else{
                    $c[$key] = $valueA.'/'. $b[$key];
                }
            }
            else{
                $c[$key] = "error nor string nor number";          
            }
        }
        else{
            $c[$key] = "error not same type";
        }

    }
    return $c;

}

    $arraySum = mergeSameArray($a,$b);
    print_r($arraySum);
  

Ответ №2:

Вот мой вклад, используя array_walk и делая несколько предположений о правилах слияния:

 $a = Array(
    'price' => 123,
    'category' => 'Fiction',
    'bookname' => 'Any-Book',
    'type' => 'Futuristic'
);
$b = Array (
    'price' => 145,
    'category' => 'Fantasy',
    'bookname' => 'Any-Book',
    'type' => 'Futuristic'
);

array_walk ($a,
    function (amp;$v, $k, $comp) {
        if (is_int($v)) {
            $v = $v   $comp[$k];
        } else {
            if ($comp[$k] != $v) {
                $v = "$v/" . $comp[$k];
            }
        }
    }, $b);

var_dump($a);
  

Предположения таковы: если значение в массиве $a равно int , то суммируйте его с эквивалентом в $b . Если значение не int соответствует, сравните его с эквивалентом в $b , и если оно совпадает, оставьте его в покое; в противном случае объедините / с ним .

Комментарии:

1. Ваше решение намного элегантнее моего, но вы забыли тип с плавающей запятой

2. Спасибо! у нас одинаковые коды! Я что-то перепутал в условии. Это, безусловно, лучший ответ. Спасибо вам всем!