PHP中多维表的扁平化

PHP中多维表的扁平化,php,arrays,performance,multidimensional-array,Php,Arrays,Performance,Multidimensional Array,我必须在PHP中对多维表进行扁平化,以使以下函数更具可读性。此外,此脚本的效果需要一点时间。下面是应该起作用的代码: $data = array( "one" => "one", "two" => array( "three" => "three", "four" => "four", ), "five" => "five", "six" => array( "seven" => "seven", "eight" => array( "nine"

我必须在PHP中对多维表进行扁平化,以使以下函数更具可读性。此外,此脚本的效果需要一点时间。下面是应该起作用的代码:

$data = array(
"one" => "one",
"two" => array(
"three" => "three",
"four" => "four",
),
"five" => "five",
"six" => array(
"seven" => "seven",
"eight" => array(
"nine" => "nine",
"ten" => "ten"
)
)
);

$flat=array();

do{
$newFlat=array();
if(empty($data)) break;
if(empty($flat)) $flat = $data;
$findArray = FALSE;
foreach($flat as $key => $value){
    if(is_array($value)){
        if(is_string($key)) $newFlat[] = 'Start'.$key;
        foreach($value as $keySec => $valueSec){
            if(is_array($valueSec)){
                if(is_string($keySec)) $newFlat[] = 'Start'.$keySec;
                $newFlat[] = $valueSec;
                if(is_string($keySec)) $newFlat[] = 'End'.$keySec;
                $findArray = TRUE;
            }else{
                $newFlat[$keySec] = $value;
            }
        }
        if(is_string($key)) $newFlat[] = 'End'.$key;
    }else{
        $newFlat[$key] = $value;
    }
}
$flat = $newFlat;
}while($findArray);
print_r($flat);
结果是美元持平。您可能知道如何转换此脚本以利用更少的时间和内存?我希望结果如下所示:

/*
    Result $flat looking like it:
    $flat = [
      'one' => 'one',
          1 => 'Starttwo',
    'three' => 'three',
     'four' => 'four',
          4 => 'Endtwo',
     'five' => 'five,
          6 => 'StartSix',
    'seven' => 'seven',
          8 => 'Starteight',
     'nine' => 'nine',
      'ten' => 'ten',
         11 => 'Endeight',
         12 => 'EndSix'
    ];
    */
对不起,我的英语太糟糕了。我想,尽管如此,你还是会理解我的。

试试看:

class array_class
{

  public $data = array();
  public $new_array = array();
  public $value = 1; 
  public $number = "";

  public function __construct($data)
  {
    $this->data = $data;
    $this->flatten_array($this->data);
  }

  private function flatten_array($array)
  {
    foreach($array as $key => $value)
    {            
      if(is_array($value))
      {
        $this->number = $key;
        $this->new_array[$this->value++] = "Start" . $key;
        $this->flatten_array($value);
      }
      else
      {        
        $this->new_array[$key] = $value;
        $this->value++;
      }      
    }         
      $this->new_array[$this->value] = "End" . $this->number;        
  }
}
输出:

class array_class
{

  public $data = array();
  public $new_array = array();
  public $value = 1; 
  public $number = "";

  public function __construct($data)
  {
    $this->data = $data;
    $this->flatten_array($this->data);
  }

  private function flatten_array($array)
  {
    foreach($array as $key => $value)
    {            
      if(is_array($value))
      {
        $this->number = $key;
        $this->new_array[$this->value++] = "Start" . $key;
        $this->flatten_array($value);
      }
      else
      {        
        $this->new_array[$key] = $value;
        $this->value++;
      }      
    }         
      $this->new_array[$this->value] = "End" . $this->number;        
  }
}
试试这个:

function flatten_array($data) {
    $newArray = array();
    foreach ($data as $key => $value) {
        if (is_array($value)) {
            $newArray[] = 'Start' . $key;
            $newArray = array_merge($newArray,flatten_array($value));
            $newArray[] = 'End' . $key;
        } else {
            $newArray[$key] = $value;
        }
    }
    return $newArray;
}

$flat = flatten_array($data);

print_r($flat);
输出:

Array
(
    [one] => one
    [0] => Starttwo
    [three] => three
    [four] => four
    [1] => Endtwo
    [five] => five
    [2] => Startsix
    [seven] => seven
    [3] => Starteight
    [nine] => nine
    [ten] => ten
    [4] => Endeight
    [5] => Endsix
)

哪个是期望的输出?它必须处理哪些输入情况?这将只处理两层嵌套(PHP数组不是多维的,它们是嵌套的)。外部循环提供了什么用途?虽然此示例数组不可能使用
empty()
,但如果您在带有数字键的数组上尝试此循环,则使用
empty(0)
的结果将是TRUE。您试图实现什么?什么是扁平化?