【问题标题】:PHP merge 2 arrays with different number of elements, $keys from one, $values from anotherPHP 合并 2 个具有不同元素数量的数组,$keys 来自一个,$values 来自另一个
【发布时间】:2015-08-17 22:27:02
【问题描述】:

我想将具有不同数量元素的 2 个数组合并在一起,使用其中一个的键和另一个键匹配的值。包含所需值的数组中的元素可能较少,尽管我想保留原始数组中生成的空键。例如:

//包含我想保留的键的数组

$arr1 = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);

//包含我想使用的值的数组

$arr2 = array(01=>123, 03=>123, 05=>123, 07=>123, 09=>123, 11=>123);

//带有一些无价值元素的期望结果

$results = array(01=>123, 02, 03=>123, 04, 05=>123, 06, 07=>123, 08, 09=>123, 10, 11=>123, 12);

如您所见,结果数组保留了 12 个元素,但仅将值应用于 2 个数组中的键匹配的位置。

我在其他 PHP 函数中尝试过 $results = array_intersect_key($arr1 + $arr2, $arr2); 以及:

for ($i=1; $i < count($arr1); $i++) {
    if (isset($arr2[$i])) {
        $arr3[] = $arr2[$i];
    } else {
        $arr3[] = $arr1[$i];
    }
}

print_r($arr3);

还没有运气。

提前致谢!

【问题讨论】:

  • 您意识到0809 的值不会是大多数人所期望的,但实际上是0.... 以0 开头的数字被视为八进制值
  • 认为我理解您的评论并进行了相应的编辑。非常感谢。有解决方案的想法吗?
  • 那么,$arr1 中的 是否应该是 $results 中的
  • @Don'tPanic,是的,完全正确。

标签: php arrays merge


【解决方案1】:

对于这样的数组

$arr1 = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
$arr2 = array(1=>123, 3=>123, 5=>123, 7=>123, 9=>123, 11=>123);

这应该可以。

foreach ($arr1 as $key) {
    $results[$key] = isset($arr2[$key]) ? $arr2[$key] : null;
}

或使用其他一些 PHP 函数:

$results = array_replace(array_fill_keys($arr1, null), $arr2);

【讨论】:

  • 以前从未在数组函数列表中注意到array_replace(),谢谢。
  • 几天前我在另一个答案中遇到了array_replace(),我之前也从未注意到它。
【解决方案2】:
//Array that contains keys I would like to retain
$arr1 = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);

//Array that contains values I'd like to use
$arr2 = array(1=>123, 3=>123, 5=>123, 7=>123, 9=>123, 11=>123);

$result = array_fill_keys(
    $arr1,
    null
);
array_walk(
    $result,
    function(&$value, $key) use($arr2) {
        $value = (isset($arr2[$key])) ? $arr2[$key] : null;
    }
);
var_dump($result);

【讨论】:

    【解决方案3】:

    首先将$arr1 的值设置为false 以仅保留键: $arr1 = array_fill_keys(array_keys($arr1), false); 或者,如果您自己生成 $arr1,请将其定义为:$arr1 = Array(false, false, false, false /* etc. */);

    现在使用数组联合运算符:

    $result = $arr2 + $arr1;

    + 运算符返回附加到左侧数组的右侧数组;对于两个数组中都存在的键——来自文档:http://php.net/manual/en/language.operators.array.php)

    然后,如果需要,按键对数组进行排序:ksort($array);

    【讨论】:

    • "使用一个键和另一个键"
    • 谢谢@rjdown,我现在也添加了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    相关资源
    最近更新 更多