2017-09-04 1 views
0

J'ai le tableau suivant, comment puis-je faire une sélection avec indication de niveau.Catégorie select avec parent_id et indication de niveau

L'indication de niveau doit être - niveau 1, - niveau 2, - niveau 3 --- .......

array(0 => array(
      'id' => 1, 
      'name' => 'Bikes', 
      'description' => 'bikes desc', 
      'parent_id' => 0 
      'childs' => array(
       0 => array(
        'id' => 2, 
        'name' => 'Mountainbike', 
        'description' => 'mountainbike desc', 
        'parent_id' => 1, 
        'childs' => array(
         0 => array(
          'id' => 3, 
          'name' => 'Mountainbike spikes', 
          'description' => 'Mountainbike spikes', 
          'parent_id' => 2 
         ), 
        ), 
       ), 
       1 => array(
        'id' => 5, 
        'name' => 'Sportbike', 
        'description' => 'sportbike', 
        'parent_id' => 1 
       ), 
      ), 
     ), 
     1 => array(
      'id' => 4, 
      'name' => 'Car', 
      'description' => 'car', 
      'parent_id' => 0 
     ), 
    ); 

sortie souhaitable:

<select> 
    <option id="1">Bikes</option> 
    <option id="2">- Mountainbike</option> 
    <option id="3">-- Mountainbike spikes</option> 
    <option id="5">- Sportbike</option> 
    <option id="4">Car</option> 
</select> 
+0

Vous devriez regarder dans "fonctions récursives". –

+0

@MagnusEriksson \t comment puis-je y parvenir? – Bas

+0

Avez-vous regardé et essayé quelque chose? SO n'est pas un service de codage gratuit. Je vous ai donné un point de départ de ce qu'il faut rechercher. Voici une explication: https://stackoverflow.com/questions/2648968/what-is-a-recursive-function-in-php Maintenant, c'est à vous de lire, d'apprendre et d'essayer quelque chose. –

Répondre

0

Voici.

Ce code génèrera une boîte de sélection jusqu'à trois niveaux seulement.

<?php 
$arr = array(
     0 => array(
      'id' => 1, 
      'name' => 'Bikes', 
      'description' => 'bikes desc', 
      'parent_id' => 0, 
      'childs' => array(
       0 => array(
        'id' => 2, 
        'name' => 'Mountainbike', 
        'description' => 'mountainbike desc', 
        'parent_id' => 1, 
        'childs' => array(
         0 => array(
          'id' => 3, 
          'name' => 'Mountainbike spikes', 
          'description' => 'Mountainbike spikes', 
          'parent_id' => 2 
         ), 
        ), 
       ), 
       1 => array(
        'id' => 5, 
        'name' => 'Sportbike', 
        'description' => 'sportbike', 
        'parent_id' => 1 
       ), 
      ), 
     ), 
     1 => array(
      'id' => 4, 
      'name' => 'Car', 
      'description' => 'car', 
      'parent_id' => 0 
     ), 
    ); 
?> 
<!DOCTYPE html> 
<html> 
<head> 
    <title>Multi Level</title> 
</head> 
<body> 
    <select> 
<?php 
    $main = $str = ''; 
    foreach ($arr as $levelOne) //$arr is the array as you given above, So please change it with your parameter. 
    { 
     $str = '<option id="'.$levelOne['id'].'"> - '.$levelOne['name']; // First option from level one array 
     if(isset($levelOne['childs']) && sizeof($levelOne['childs'] > 0)) // Checking if the level has child? if yes then we again add the option along with name and id. 
     { 
      foreach($levelOne['childs'] as $levelTwo) 
      { 
       $str .= '<option id="'.$levelTwo['id'].'"> -- '.$levelTwo['name']; 
       if(isset($levelTwo['childs']) && sizeof($levelTwo['childs'] > 0)) 
       { 
        foreach($levelTwo['childs'] as $levelThree) 
        { 
         $str .= '<option id="'.$levelThree['id'].'"> --- '.$levelThree['name'].'</option>'; // Level three option 
        } 
       } 
       $str .= '</option>'; // Level Two option 
      } 
     } 
     $str .= '</option>'; // Level One option 
     $main .= $str; // each time we are adding generated option list in the main string. 
    } 
    echo $main; 
?> 
    </select> 
</body> 
</html> 
+0

Vous devez inclure une explication dans votre réponse pour expliquer pourquoi le PO devrait l'utiliser, ce qu'il fait réellement et comment il résout le problème. Vous pouvez également ajouter que ce code ne prend en charge que trois niveaux. –

0

Vous pouvez utiliser le code ci-dessous pour votre solution.

echo "<select name=''>"; 
$opt = ""; 
if (count($array) > 0) { 
    foreach ($array as $data) { 
     if ($data['parent_id'] == 0) { 
      $opt .= "<option value='" . $data['id'] . "'>" . $data['name'] . "</option>"; 
      if (count($data['childs']) > 0) { 
       foreach ($data['childs'] as $child) { 
        $opt .= "<option value='" . $child['id'] . "'>-" . $child['name'] . "</option>"; 
        if (count($child['childs']) > 0) { 
         foreach ($child['childs'] as $sub_child) { 
          $opt .= "<option value='" . $sub_child['id'] . "'>--" . $sub_child['name'] . "</option>"; 
         } 
        } 
       } 
      } 
     } 
    } 
    echo $opt; 
} 
echo "</select>"; 

Vous obtenez une sortie comme ci-dessous.

<select name=""> 
<option value="1">Bikes</option> 
<option value="2">-Mountainbike</option> 
<option value="3">--Mountainbike spikes</option> 
<option value="5">-Sportbike</option> 
<option value="4">Car</option> 
</select>