【问题标题】:Flattening of multidimensional table in PHPPHP中多维表的展平
【发布时间】:2015-01-26 14:32:52
【问题描述】:

我必须在 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);

结果是 $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'
    ];
    */

附言。对不起我应受谴责的英语。我想,尽管如此,你会理解我的。

【问题讨论】:

  • 这是所需的输出
  • 它必须处理哪些输入案例?这只会处理两层嵌套(PHP 数组不是多维的,它们是嵌套的)。外循环提供什么目的?
  • 虽然不能使用这个示例数组,但如果你曾经在一个带有数字键的数组上尝试这个循环,那么你对empty() 的使用会炸毁你:empty(0) 评估为 是的
  • 你想要完成什么?什么是扁平化?

标签: php arrays performance multidimensional-array


【解决方案1】:

试试这个:

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
)

【讨论】:

    【解决方案2】:

    试试:

    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;        
      }
    }
    

    输出:

    Array
    (
       [one] => one
       [2] => Starttwo
       [three] => three
       [four] => four
       [5] => Endtwo
       [five] => five
       [6] => Startsix
       [seven] => seven
       [8] => Starteight
       [nine] => nine
       [ten] => ten
       [11] => Endeight
    )
    

    【讨论】:

      猜你喜欢
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 2013-09-12
      • 2021-09-17
      • 1970-01-01
      • 2012-08-27
      相关资源
      最近更新 更多