У меня есть 2 ассоциативных массива: $ arr1 & $ arr2. Я хотел бы создать $ arr3, который бы сочетал «имя» и «символ», если даты совпадают … если даты не совпадают, то просто символ:
Вот $ arr1:
Array ( [0] => stdClass Object ( [date] => 2010/01/01 [name] => Mario Lopez ) [1] => stdClass Object ( [date] => 2010/01/02 [name] => Lark Voorhies ) )
Вот $ arr2:
Array ( [0] => Array ( [date] => 2010/01/01 [character] => AC Slater ) [1] => Array ( [date] => 2010/01/02 [character] => Lisa Turtle ) [2] => Array ( [date] => 2010/01/03 [character] => Kelly Kapowski ) )
Использование array_intersect дает следующую ошибку: «Объект класса stdClass не может быть преобразован в строку».
Вот что я хотел бы получить, если это возможно (например, $ arr3):
Array ( [0] => stdClass Object ( [date] => 2010/01/01 [name] => Mario Lopez [character] => AC Slater ) [1] => stdClass Object ( [date] => 2010/01/02 [name] => Lark Voorhies [character] => Lisa Turtle ) [2] => stdClass Object ( [date] => 2010/01/03 [character] => Kelly Kapowski ) )
Эта функция была опубликована на php.net, и я использую ее довольно долгое время. Он должен делать то, о чем вы просите
function array_extend($a, $b) { foreach($b as $k=>$v) { if( is_array($v) ) { if( !isset($a[$k]) OR isset($v[0])) { $a[$k] = $v; } else { $a[$k] = array_extend($a[$k], $v); } } else { $a[$k] = $v; } } return $a; }
Применение:
$array = array_extend($orig_array,$new_array);
Обратите внимание, что вам придется либо преобразовать объекты в массивы, либо изменить функцию для преобразования объекта в массив «на лету» ($ a = (array) $ a);
Редактировать:
Оригинальный источник http://www.php.net/manual/en/function.array-merge.php#95294
Обратите внимание, что я сделал небольшую модификацию, чтобы решить проблему с данной функцией, где она не будет правильно расширять массив с помощью цифровых клавиш