PHP çok boyutlu dizi bir 1D dizi dönüştürmek

5 Cevap php
Array
(
    [1] => animal
    [1-1] => turtle
    [1-1-1] => sea turtle
    [1-1-2] => box turtle
    [1-1-3] => green turtle
    [1-1-3-1] => green turtle with brown tail
)

ve ben nasıl bazı dönüştürmek istiyorum:

Array
(
    [1-title] => animal
    [1-sons] => array(
    	    [1-1-title] => turtle
    	    [1-1-sons] => array(
    			    [1-1-1] => sea turtle
    	    		    [1-1-2] => box turtle
    			    [1-1-3-title] => green turtle
    			    [1-1-3-sons] => array(
    	  				    [1-1-3-title] => green turtle
    					          )
    				)
    	      )
)

ya da belki Çıktılanan dizi düzenlemek için daha iyi bir yol önerebilirsiniz ..

ama bunu nasıl?

Elimden veriler üzerinde yürümek ve onları dışarı ağaç yapacak bir ayrıştırıcı yazıyorum, hiç de kolay bir iş değil biliyorum ..

Lütfen yardım ve tavsiyeleri için şimdiden teşekkürler ..

5 Cevap

Verilerinizi organize kolay yolu böyle bir şekilde olacaktır:

array (
  'Animal' =>
  array (
    'Kaplumbağa' =>
    array (
      'Sea Kaplumbağa',
      'Box Kaplumbağa',
      'Green Kaplumbağa' =>
      array (
        'Green Kaplumbağa With Brown Tail',
      ),
      'Common Kaplumbağa',
    ),
  ),
);

// Or, otherwise written (equivalent to the above)

$animals = array();
$animals['Animal'] = array();
$animals['Animal']['Kaplumbağa'] = array();
$animals['Animal']['Kaplumbağa'][] = 'Sea Kaplumbağa';
$animals['Animal']['Kaplumbağa'][] = 'Box Kaplumbağa';
$animals['Animal']['Kaplumbağa']['Green Kaplumbağa'] = array();
$animals['Animal']['Kaplumbağa']['Green Kaplumbağa'][] = 'Green Kaplumbağa With Brown Tail';
$animals['Animal']['Kaplumbağa'][] = 'Common Kaplumbağa';

Esasen, hayvanın ismi çocuk sürece, değer bir dizidir ve anahtar hayvan adım, değerdir.


Bu şekilde, kolayca aşağıdakileri yaparak değerleri ayrıştırmak:

parse_animals($animals);

function parse_animals($array, $indent = 0) {
  if(!is_array($array)) return;    // A little safe guard in case.

  foreach($array as $key => $value) {
    echo str_repeat('  ', $indent) . "- ";

    if(is_array($value)) {
      echo $key . "\n";
      parse_animals($value, $indent + 1);
    } else {
      echo $value . "\n";
    }
  }
}

Konsolunda yukarıdaki çıktı şu olacaktır:

- Animal
  - Kaplumbağa
    - Sea Kaplumbağa
    - Box Kaplumbağa
    - Green Kaplumbağa
      - Green Kaplumbağa With Brown Tail
    - Common Kaplumbağa

EDIT: Ve burada bir sürüm olduğunu olacak bir web sayfası için çıktı o.

function parse_animals_web($array) {
  if(!is_array($array)) return;    // A little safe guard in case.

  foreach($array as $key => $value) {
    echo '<ul>';

    if(is_array($value)) {
      echo '<li>' . htmlentities($key) . "</li>";
      parse_animals_web($value);
    } else {
      echo '<li>' . htmlentities($value) . "</li>";
    }

    echo '</ul>';
  }
}

Çıktısı:

  • Animal
    • Kaplumbağa
    • Sea Kaplumbağa
    • Box Kaplumbağa
    • Green Kaplumbağa
      • Green Kaplumbağa With Brown Tail
    • Common Kaplumbağa


Belki bir hayvanın çocukları almak istiyorum.

function get_children_of($array, $name) {
  foreach($array as $key => $value) {
    if(is_array($value)) {
      if($key === $name) {
        return $value;
      } else {
        return get_children_of($value, $name);
      }
    }
  }

  return array();
}

Şimdi tüm Green Kaplumbağa çocukları ve çıkış onları alabilirsiniz.

$green_turtle = get_children_of($animals, 'Green Kaplumbağa');
parse_array($green_turtle);

Çıktısı:

- Green Kaplumbağa With Brown Tail


Eğer giriş dizi garip biçimde olmak sıkışmış olduğunu söylüyor beri EDIT:, burada yukarıda belirtilen biçime dizi dönüştürmek bir fonksiyonudur:

function convert_array($array) {
  $new_array = array();

  $keys = array_keys($array);
  foreach($keys as $key) {
    $level = explode('-', $key);
    $cur_level = &$new_array;
    $cur_key = '';

    foreach($level as $o_key) {
      $cur_key = ltrim($cur_key . '-' . $o_key, '-');
      $next_key = $cur_key . '-1';
      $value = $array[$cur_key];
      $has_child = array_key_exists($next_key, $array);

      if($has_child) {
        if(!array_key_exists($value, $cur_level)) {
          $cur_level[$value] = array();
        }
        $cur_level = &$cur_level[$value];
      } else {
        $cur_level[] = $value;
      }
    }
  }

  return $new_array;
}

Bu gerçekten nasıl / size çıkan ağacını kullanmak için gidiyoruz ne için. Bağlıdır Belki bu konuda daha fazla ayrıntı yazabilirim?

Bu deneyin:

$array = array(
    '1' => 'animal',
    '1-1' => 'turtle',
    '1-1-1' => 'sea turtle',
    '1-1-2' => 'box turtle',
    '1-1-3' => 'green turtle',
    '1-1-3-1' => 'green turtle with brown tail'
);
$tree = array();
foreach ($array as $path => $val) {
    $segments = explode('-', $path);
    $last = array_pop($segments);
    $tmp = &$tree;
    $path = '';
    foreach ($segments as $segment) {
        $path .= $segment.'-';
        if (!isset($tmp[$path.'sons'])) {
            $tmp[$path.'sons'] = array();
        }
        $tmp = &$tmp[$path.'sons'];
    }
    $tmp[$path.$last.'-title'] = $val;
}
print_r($tree);

Ama veri yapısı çok mantıklı değil.

Ne elde etmek çalıştığınız bir iç içe seti ve çocuk girişinde ana id kaydetmek olacaktır uygulamak için bu nedenle en kolay yolu bir tür:

// the tree
0 => array(parent => NULL, name => turtle),
1 => array(parent => 0, name => green turtle),
2 => array(parent => 0, name => blue turtle),
3 => array(parent => 1, name => green turtle with yellow nose)

Sen basit bir özyinelemeli işlevi kullanarak bu hiyerarşinin yürüyerek gezebilirsiniz.

Yerine birleşmeli diziler nesneleri kullanırsanız hatta bazı performans artışı olsun.

$result = array();
foreach ($array as $position => $text) {
    $p = explode('-', $position); 
    putIntoTree($result, $p, $text);
}

function putIntoTree( &$tree, $posInfo, $item ) {
    $index = array_shift($posInfo) - 1;

    if (!count($posInfo)) {
        $tree[$index]['name'] = $item;
    } else {         
        if (!isset($tree[$index]['children'])) {
            $tree[$index]['children'] = array();
        }
        putIntoTree($tree[$index]['children'], $posInfo, $item);
    }   
}

Veri tutmak için makul bir yol gibi görünüyor, bu sonuçları,.

Array
(
    [0] => Array
        (
            [name] => animal
            [children] => Array
                (
                    [0] => Array
                        (
                            [name] => turtle
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [name] => sea turtle
                                        )

                                    [1] => Array
                                        (
                                            [name] => box turtle
                                        )

                                    [2] => Array
                                        (
                                            [name] => green turtle
                                            [children] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [name] => green turtle with brown tail
                                                        )
                                                )
                                        )
                                )
                        )
                )
        )
)