根据值中的前导破折号创建多级数组

时间:2017-02-01 14:53:53

标签: php arrays

我目前有以下数组:

$options = array(
  'a' => 'Test 1',
  'b' => '-Test 2',
  'c' => '-Test 3',
  'd' => '--Test 4',
  'e' => '--Test 5',
);

我想在多级数组中对其进行转换,每个虚线表示一个级别更深。所以这个数组应该成为:

Array(
  [Test 1], => Array(
    [b] => 'Test 2',
    [Test 3] => Array(
      [d] => 'Test 4',
      [e] => 'Test 5',
    )
  )
)

我目前的工作深度为一级,但我想创建一个能够处理任何深度级别的函数。这就是我现在所做的:

  $list = array();
  foreach ($options as $key => $value) {
    if($value[0] == '-') {
      if (!isset($list[$lastvalue])) {
        unset($list[$lastkey]);
        $list[$lastvalue] = array();
      }
      $value = substr($value, 1); // remove the leading dash
      $list[$lastvalue][$key] = $value;
    }
    else {
      $list[$key] = $value;
      $lastkey = $key;
      $lastvalue = $value;
    }
  }

1 个答案:

答案 0 :(得分:1)

罗马的一种方式......

$opt = array(
    'a' => 'Test 1',
    'b' => '-Test 2',
    'c' => '-Test 3',
    'd' => '--Test 4',
    'e' => '--Test 5',
);
$tmp=array(); $lvl=null;
foreach(array_reverse($opt) as $idx => $set){
    $clean = ltrim($set,'-');
    if(!is_null($lvl)){
        if($lvl == substr_count($set,'-')){
           $tmp[$idx] = $clean;
        } else {
           $_tmp[$clean]=is_array($tmp)?$tmp:ltrim($tmp,'-');
           $tmp = $_tmp;
           $_tmp = array();
           $lvl = substr_count($set,'-');
        }
    } else {
        $lvl = substr_count($set,'-');
        $tmp[$idx] = $clean;
    }    
}
print '<pre>';
print_r($tmp);
print '</pre>';

结果:

Array
(
    [Test 1] => Array
        (
            [Test 3] => Array
                (
                    [e] => Test 5
                    [d] => Test 4
                )
            [b] => Test 2
        )
)

如果给定的数组是正确的,那么也可以使用更深层次。