[英]Creating associative array from linear array in PHP
我正在使用一个返回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
)
据我所知,没有内置函数可以执行此操作,但您可以使用如下函数:
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循环,而不是一个单独的循环来提取偶数和奇数值。
您自己的解决方案肯定更清晰,但这个仅由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
数组的转换,这是通过调用array_map
并使用null
作为第一个参数来实现的(参见手册中的“有趣地使用这个函数......”)
像这样的循环可以工作:
$array = json_decode(....);
$received = array();
for ($i = 0; $i < count($array); $i++) {
$received[$array[$i]] = $array[$i+1];
$i++;
}
var_dump($received);
调整其他答案中的代码:
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;
}
说到1-liners:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.