将具有浮点索引的php数组解析为新数组


Parse a php array that has float index into new array

我有一个从插件中获得的带有浮点索引的数组。我想解析这个数组,并将浮动的数组作为一个新数组放入。意思是我有

[1] => gsurvey128f54af2
[2] => gsurvey282bd4253
[5.1] => gsurvey5649a964f
[5.2] => gsurvey5fddb5e9f
[5.3] => gsurvey533c5b311
[5.4] => gsurvey5c8933efb
[5.5] => gsurvey5da48f59b

我想要的是:

    [1] => gsurvey128f54af2
    [2] => gsurvey282bd4253
    [5] => array ( 
         [0] => gsurvey5649a964f
         [1] => gsurvey5fddb5e9f
         [2] => gsurvey533c5b311
         [3] => gsurvey5c8933efb
         [4] => gsurvey5da48f59b
)

我不清楚处理这个问题的最佳方法是什么。

我在上面评论说,这个问题很容易出错,因为可能会有将单个值同时设置为字符串和数组的输入。这显然会失败。假设输入是干净的。。。

$new_array = array();
foreach($old_array as $key=>$val)
{
  $a = explode('.', $key);
  if(sizeof($a)==2)
  {
    if(!isset($new_array[$a[0]])) $new_array[$a[0]] = array();
    $new_array[$a[0]][] = $val;
  }
  else $new_array[$key]=$val;
}

array_walk示例:

$array = array (
    '1' => 'gsurvey128f54af2',
    '2' => 'gsurvey282bd4253',
    '5.1' => 'gsurvey5649a964f',
    '5.2' => 'gsurvey5fddb5e9f',
    '5.3' => 'gsurvey533c5b311',
    '5.4' => 'gsurvey5c8933efb',
    '5.5' => 'gsurvey5da48f59b'
);
$output = array();
array_walk( $array, function( $item, $key ) use ( &$output ) {
    $keys = explode( '.', $key );
    isset( $keys[1] ) ? $output[ $keys[0] ][ $keys[1] ] = $item : $output[ $keys[0] ] = $item;
});
print_r( $output );
/*
Array
(
    [1] => gsurvey128f54af2
    [2] => gsurvey282bd4253
    [5] => Array
        (
            [1] => gsurvey5649a964f
            [2] => gsurvey5fddb5e9f
            [3] => gsurvey533c5b311
            [4] => gsurvey5c8933efb
            [5] => gsurvey5da48f59b
        )
)
*/

对于这个特定的情况,这应该有效:

foreach($array as $k => $v) {
    if(count($i = explode('.', $k)) > 1) {
        $result[$i[0]][] = $v;
    } else {
        $result[$k] = $v;
    }
}