PHP中从线性数组创建关联数组

4

我正在使用一个返回JSON数据的Web服务,当我用PHP的json_decode函数解码时,会得到以下类似的数组:

Array
(
 [0] => eBook
 [1] => 27
 [2] => Trade Paperback
 [3] => 24
 [4] => Hardcover
 [5] => 4
)

是否有PHP函数可以将这个数组合并成一个关联数组,其中每隔一个元素是一个键,后面的元素是它的值?我想要得到的是以下内容:

Array
(
 [eBook] => 27
 [Trade Paperback] => 24
 [Hardcover] => 4
)
5个回答

5
据我所知,没有内置的功能可以完成此操作,但您可以使用以下类似的函数:
function combineLinearArray( $arrayToSmush, $evenItemIsKey = true ) {
    if ( ( count($arrayToSmush) % 2 ) !== 0 ) {
        throw new Exception( "This array cannot be combined because it has an odd number of values" );
    }

    $evens = $odds = array();

    // Separate even and odd values
    for ($i = 0, $c = count($arrayToSmush); $i < $c; $i += 2) {
        $evens[] = $arrayToSmush[$i];
        $odds[] = $arrayToSmush[$i+1];
    }

    // Combine them and return
    return ( $evenItemIsKey ) ? array_combine($evens, $odds) : array_combine($odds, $evens);
}

你可以使用你想要合并为关联数组的数组来调用它,并且可以使用可选标志指示是否使用偶数或奇数元素作为键。
编辑:我更改了代码,现在只使用一个for循环,而不是一个单独的循环来提取偶数和奇数值。

6
既然你已经知道答案,为什么还要问呢? - Shubham
1
Stack Overflow鼓励这种知识共享:http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ 由于PHP库中没有执行此操作的函数,我想让它对那些可能正在寻找解决此类问题的人们可用。 - Andrew
@RobertHarvey,请注意问题和答案的时间戳。 - tereško
@tereško 那又怎样?现在官方已经正式支持即时自我回答了。请阅读我提供的元帖。 - Robert Harvey

4

你自己的解决方案肯定更清晰,但是这个只用PHP函数构成的一行代码也能完成同样的工作:

$output = call_user_func_array('array_combine', call_user_func_array('array_map', array_merge(array(null), array_chunk($input, 2))));

您的问题是“是否有一个PHP函数...”,答案是否定的,但对于组合来说是肯定的。
这里棘手的部分是块状数组的转置,通过调用array_map并将null作为第一个参数来实现(请参见手册中的“此函数的有趣用法...”)。

我喜欢这个。我肯定会选择这段代码(再加上一些好的文档,这样其他贡献者就不必费尽心思了)。 - Andrew
...但是您已经选择了另一个代码。文档都在PHP手册中,除了矩阵转置技巧有点隐蔽。 - Walter Tross
没问题。在你发出问题之前,我已经接受了其他答案。它们都是非常好的答案,但我认为你的回答对讨论增加了更多的内容(这也是SO的宗旨,对吧?) - Andrew

1
一个像这样的循环可以工作:
$array = json_decode(....);

$received = array();
for ($i = 0; $i < count($array); $i++) {
    $received[$array[$i]] = $array[$i+1];
    $i++;
}

var_dump($received);

是的,那就是我建议的,除了为什么在计数-1上使用<=? - somedev
因为计数将从1开始,但您的数组键从0开始。 - Mike Mackintosh
如果你没有添加-1,那么在数组末尾会有一个空的键/值对。 - Mike Mackintosh
3
请勿使用 sizeof()。它只是一个别名,除了使代码难以阅读之外没有任何作用。请使用适当的函数 count() - ircmaxell
1
你是否期望原始数组会改变?如果不是,那么为什么一直重新计算它呢?而且你迭代的方式很令人困惑:“for( $i = 0; $i < $max ; $i+=2 )”会更加简洁。 - tereško
显示剩余3条评论

1

对其他答案中的代码进行调整:

function combineLinearArray( $arrayToSmush) {

if ( ( count($arrayToSmush) % 2 ) !== 0 ) {
    throw new Exception( "This array cannot be combined because it has an odd number of values" );
}

$combined = array();
for ($i = 0, $i<count($arrayToSmush); $i++) {
    $combined[$arrayToSmush[$i]] = $arrayToSmush[$i+1];
    $i++; // next key
}

// Combine them and return
return $combined;
}

0

说到一行代码:

array_reduce(array_chunk($input, 2), function(&$r, $i) { !empty($i[0]) && $r[$i[0]] = @$i[1]; return $r; }, array());

这个一行代码还验证了结果关联键的立即有效性,并且比被接受的代码短10个字符左右 https://dev59.com/KGXWa4cB1Zd3GeqPOJAr#11265111


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接