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
)
4

5 回答 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 循环,而不是使用单独的循环来提取偶数和奇数值。

于 2012-06-29T15:32:12.160 回答
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_mapwithnull作为第一个参数来实现的(参见手册,其中说“这个函数的一个有趣的使用......”)

于 2012-06-29T15:58:03.577 回答
1

像这样的循环可以工作:

$array = json_decode(....);

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

var_dump($received);
于 2012-06-29T15:43:27.797 回答
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;
}
于 2012-06-29T15:45:35.190 回答
0

说到 1-liner:

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

这个 1-liner 还验证了生成的关联密钥的即时有效性,并且比公认的密钥短 10 个左右的字符https://stackoverflow.com/a/11265111/1990515

于 2013-04-12T13:02:50.613 回答