#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. Спасибо! у нас одинаковые коды! Я что-то перепутал в условии. Это, безусловно, лучший ответ. Спасибо вам всем!