【问题标题】:PHP - merge two arrays similar to array_combine, but with duplicate keysPHP - 合并两个类似于 array_combine 的数组,但有重复的键
【发布时间】:2012-01-31 11:31:13
【问题描述】:

我有两个数组:

$arrKeys = array('str', 'str', 'otherStr');
$arrVals = array('1.22', '1.99', '5.17');

我想把它们合并成这样的东西

$arrResult = array(
    array('str' => 1.22),
    array('str' => 1.99),
    array('otherStr' => 5.17)
);

键是非唯一的,否则我会使用array_combine。这会产生一些不同的输出,但它也适合我。

这是否可以使用 PHP 5.2.x 以优雅的方式完成,无需 foreach/for 循环,最好使用 PHP 的内置函数?

【问题讨论】:

  • php 数组中不能有非唯一键。
  • @chelmertz - 是的,这就是为什么我不使用 array_combine 并且我想获得的结果有点不同,就像我的例子中一样

标签: php arrays


【解决方案1】:

你可以使用array_map:

$arrKeys = array('str', 'str', 'otherStr');
$arrVals = array('1.22', '1.99', '5.17');
function foo($key, $val) {
   return array($key=>$val);
}

$arrResult = array_map('foo', $arrKeys, $arrVals);

print_r($arrResult);
Array
(
    [0] => Array
        (
            [str] => 1.22
        )

    [1] => Array
        (
            [str] => 1.99
        )

    [2] => Array
        (
            [otherStr] => 5.17
        )

)

顺便说一句,如果您升级到 PHP 5.3,您可以使用匿名函数来执行此操作,这会更加优雅:

array_map(function($key, $val) {return array($key=>$val);}, $arrKeys, $arrVals);

【讨论】:

  • 我想知道为什么有人会在它被接受后不添加评论而投反对票
【解决方案2】:

使用 PHP 的内置函数绝对没有什么“优雅”,也没有什么可追求的。

这不是高级时装秀。这是编程。
只要你有一个健全、可读且有效的解决方案,你就可以称之为优雅。

简单的 foreach 就可以完成这项工作。如果开始使用可行的解决方案而不是寻找“优雅”的解决方案,您会为自己带来巨大的帮助并节省大量时间。

$result = array();
foreach ($arrKeys as $i => $key) {
  $result[] = array($key => $arrVals[$i]);
}

【讨论】:

  • array_map 不简单优雅吗?
  • 没有。混淆你自己的代码与优雅毫无共同之处
  • 我在阅读array_map 时没有问题,但实际上在这里我认为对于下一个人来说,一个简单的循环就更清楚了......
  • 就像你这样做的方式,伙计.. :)
  • 哈哈。 PHP 的内置函数在 C 中进行了优化和编译 - 即 比您使用“理智、可读、优雅”的 PHP 代码编写的 hackey 废话要快得多。尽可能使用优化的低级代码。
【解决方案3】:

假设您希望将 $arrKeys 中的第 0 项和 $arrVals 中的第 0 项添加到一个数组中,并且该数组是 $arrResult 中的一个项,依此类推,最简单的方法可能是一个简单的循环:

$arrResult = array();
for ($i = 0, $max = count($arrKeys); $i < $max; $i++) {
    $arrResult[] = array($arrKeys[$i], $arrValues[$i]);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2019-02-22
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    相关资源
    最近更新 更多