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

在PHP中从线性数组创建关联数组,php,arrays,Php,Arrays,我正在使用一个返回JSON数据的web服务,当我使用PHP函数解码时,它会给我一个如下所示的数组: Array ( [0] => eBook [1] => 27 [2] => Trade Paperback [3] => 24 [4] => Hardcover [5] => 4 ) Array ( [eBook] => 27 [Trade Paperback] => 24 [Hardcover] => 4 ) funct

我正在使用一个返回JSON数据的web服务,当我使用PHP函数解码时,它会给我一个如下所示的数组:

Array
(
 [0] => eBook
 [1] => 27
 [2] => Trade Paperback
 [3] => 24
 [4] => Hardcover
 [5] => 4
)
Array
(
 [eBook] => 27
 [Trade Paperback] => 24
 [Hardcover] => 4
)
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);
}
有没有一个PHP函数可以将这个数组合并成一个关联数组,其中每个其他元素都是一个键,下面的元素是它的值?我想提出以下几点:

Array
(
 [0] => eBook
 [1] => 27
 [2] => Trade Paperback
 [3] => 24
 [4] => Hardcover
 [5] => 4
)
Array
(
 [eBook] => 27
 [Trade Paperback] => 24
 [Hardcover] => 4
)
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);
}

据我所知,没有内置函数可以做到这一点,但您可以使用如下函数:

Array
(
 [0] => eBook
 [1] => 27
 [2] => Trade Paperback
 [3] => 24
 [4] => Hardcover
 [5] => 4
)
Array
(
 [eBook] => 27
 [Trade Paperback] => 24
 [Hardcover] => 4
)
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);
}
函数CombineLearArray($ArrayTosMash,$evenItemIsKey=true){
如果((计数($arrayToSmush)%2)!==0){
抛出新异常(“无法组合此数组,因为它的值为奇数”);
}
$evens=$Lobbits=array();
//分离奇偶值
对于($i=0,$c=count($arrayToSmush);$i<$c;$i+=2){
$evens[]=$arrayToSmush[$i];
$Lobbits[]=$arrayToSmush[$i+1];
}
//将它们合并并返回
return($evenItemIsKey)?数组与联合体($evens,$combines):数组与联合体($combines,$combines);
}
您可以使用要组合到关联数组中的数组和指示是否使用偶数或奇数元素作为键的可选标志来调用它


编辑:我将代码更改为仅使用一个for循环,而不是使用单独的循环来提取奇偶值。

这样的循环可以工作:

$array = json_decode(....);

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

var_dump($received);
$array=json\u解码(…);
$received=array();
对于($i=0;$i
调整另一个答案中的代码:

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;
}
函数组合EARRARY($arrayToSmush){
如果((计数($arrayToSmush)%2)!==0){
抛出新异常(“无法组合此数组,因为它的值为奇数”);
}
$combled=array();

对于($i=0,$i您自己的解决方案肯定更清晰,但是这个仅由PHP函数组成的一行程序也可以完成同样的工作:

$output = call_user_func_array('array_combine', call_user_func_array('array_map', array_merge(array(null), array_chunk($input, 2))));
您的问题是“是否存在PHP函数…”。答案是否定的,但对于两者的组合,答案是肯定的

这里比较棘手的部分是分块数组的换位,它是通过调用
array\u map
并将
null
作为第一个参数来实现的(请参见其中的“此函数的有趣用法…”)

说到单行程序:

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

这个1行代码还验证了生成的assoc密钥的即时有效性,并且比接受的密钥短10个左右字符

如果您知道答案为什么要问它?stackoverflow鼓励这种知识共享:因为PHP的库中没有这样做的函数,所以我想让可能正在搜索的人可以使用它对于这类问题的解决方案,请注意问题的时间戳和answer@tereško So?即时自我回答现在被官方认可。阅读我链接的meta帖子。是的,这是我的建议,除了为什么计数从1开始计数,但数组的键从0开始。如果你没有添加-1,你将在数组的末尾添加一个空数组键/值。请不要使用
sizeof()
。它是一个alais,只会使它更难读取。使用适当的函数
count()
…您是否希望原始数组发生更改?如果没有,那么为什么您一直在计算它。您迭代的方式令人困惑:
for($i=0;$i<$max;$i+=2)
会更干净。我喜欢这样。我肯定会选择这段代码(加上一些好的文档,这样其他所有贡献者都不必挠头)…但是您已经选择了另一个代码。除了有点隐藏的矩阵变换技巧外,所有文档都在PHP手册中。没问题。在您发布问题之前,我已经接受了另一个答案。它们都是很好的答案,但我认为您的答案会增加讨论的内容(这就是为什么如此,对吗?)