How to merge these two arrays...
$arr1 = array(
[0] => 'boofoo',
[1] => '2'
);
$arr2 = array(
[0] => 'fbfb',
[1] => '6'
);
to get a 开发者_C百科third array as follows?:
$arr3 = array(
[0] => 'boofoo',
[1] => '6'
);
That is, preserve strings that are longer and numeric values that are higher.
If both arrays have the same keys, you can do a simple foreach
and pick the better value according to their relationship regarding >
and strlen
respectively:
$arr3 = array();
foreach ($arr1 as $key => $val) {
if (array_key_exists($key, $arr2)) {
if (is_numeric($val)) {
$arr3[$key] = max($val, $arr2[$key]);
} else {
$arr3[$key] = strlen($val) > strlen($arr2[$key]) ? $val : $arr2[$key];
}
}
}
Before you ask: expr1 ? expr2 : expr3
is the conditional operator where the expressions expr2
or expr3
are evaluated based on the return value of expr1
. So if strlen($val) > strlen($arr2[$key])
is true, the conditional operation evaluates $val
, and $arr2[$key]
otherwise.
I think you can achieve via http://www.php.net/manual/en/function.array-walk.php.
I try and write some test for it soon and update post.
P.S: array_map is better(maybe walk not even good for this?)
<?php
function combine($arr1, $arr2) {
return array_map("callback", $arr1, $arr2);
}
function callback($item, &$item2) {
if (is_numeric($item)) {
return max($item, $item2);
}
if (strlen($item2) > strlen($item)) {
return $item2;
}
return $item;
}
class Tests extends PHPUnit_Framework_TestCase {
public function testMergingArrays() {
$arr1 = array(
'boofoo',
'2'
);
$arr2 = array(
'fbfb',
'6'
);
$arr3 = array(
'boofoo',
'6'
);
$this->assertEquals($arr3, combine($arr1, $arr2));
}
}
I got test in place and I could refactor it now. But this implementation does work.
You can use the array_merge()
function followed by a sort()
精彩评论