Quantcast
Channel: freelabs
Viewing all articles
Browse latest Browse all 13

Generare una lista ad albero da un array php

$
0
0

Ho convissuto con questo problema per qualche mese prima di trovare uno stralcio di soluzione: necessitavo di trasformare un array con un contenuto simile al seguente (dove ‘val’ è ovviamente un valore associato alla riga)

array("1001"=>val,
      "1002"=>val=>val,
       "1002,0001"=>val,
       "1002,0002"=>val,
       "1002,0010"=>val,
       "1002,0002,1492"=>val
);

in una lista ad albero come questa:

+ 1001 ( title: [201] desc )
	+ 1002 ( title: [202] desc )
		- 0001 ( title: [1] desc )
		+ 0002 ( title: [2] desc )
			- 1492 ( title: [44] desc )
		- 0010 ( title: [10] desc )

Dopo molte ricerche, ho trovato uno stralcio di aiuto utilizzando alcune delle funzioni presenti in questo repository su github: https://github.com/kvz/kvzlib

Riporto di seguito il codice utilizzato per la creazione della lista dall’array di origine.

$tree = array(); //l'array di origine
$tree = explodeTree($tmp, ",", true);
plotTree($tree,0,false);

function customError($errno, $errstr) {
	echo "Formato array errato.";
	exit();
}

function explodeTree($array, $delimiter, $baseval)
{
  if(!is_array($array)) return false;
  $splitRE   = '/' . preg_quote($delimiter, '/') . '/';
  $returnArr = array();
  foreach ($array as $key => $val) {
      $parts  = preg_split($splitRE, $key, -1, PREG_SPLIT_NO_EMPTY);
      $leafPart = array_pop($parts);
      $parentArr = &$returnArr;
      foreach ($parts as $part) {
          if (!isset($parentArr[$part])) {
              $parentArr[$part] = array();
          } elseif (!is_array($parentArr[$part])) {
              if ($baseval) {
                  $parentArr[$part] = array('__base_val' => $parentArr[$part]);
              } else {
                  $parentArr[$part] = array();
              }
          }
          $parentArr = &$parentArr[$part];
      }
      if (empty($parentArr[$leafPart])) {
          $parentArr[$leafPart] = $val;
      } elseif ($baseval && is_array($parentArr[$leafPart])) {
          $parentArr[$leafPart]['__base_val'] = $val;
      }
  }
  set_error_handler("customError",E_NOTICE);
  return $returnArr;
}

function plotTree($arr, $indent, $mother_run){
    foreach ($arr as $k=>$v){
        if ($k == "__base_val") continue;
        // Assegno al nodo il suo valore (val)
        $show_val = (is_array($v) ? $v["__base_val"] : $v);
	// inserisco l'indentazione
        echo str_repeat("<div style='float:left;width:20px;'>&nbsp;</div>", $indent);
        if ($indent == 0) {
            echo "<div class='tv_root'>";
			if (is_array($v))
				echo "<span id='upRoot-".$k."' style='cursor:pointer' title='Comprimi/Espandi'>+</span> ";
			else echo "+ ";
        } elseif (is_array($v)){
            echo "<div class='tv_normal'><span id='upRoot-".$k."' style='cursor:pointer' title='Comprimi/Espandi'>+</span> ";
        } else {
            echo "<div class='tv_child'>- ";
        }
       	echo $k;
		if ($show_val!=0) {
			echo " ( customTitle: [val] desc )";
		}
		echo "</div><div id='".$k."'>";
       if ($indent != 0 && !is_array($v))
            echo "</div>";

        if (is_array($v)) {
            plotTree($v, ($indent+1), false, $db);
			echo "</div>";
        }
    }

}

Le parti di codice che contribuiscono alla costruzione dell’aspetto grafico dell’albero si trovano in plotTree verso la fine, in ogni caso riporto qui di seguito anche il codice js (con jquery) utilizzato per comprimere ed espandere i nodi.

$("span").click(function() {
	     var n = $(this).attr("id").split("-");	
	     if ($("#"+n[1]).is(":hidden")) 
		$("#"+n[1]).show("slow");
	     else $("#"+n[1]).slideUp();
        });

 


Viewing all articles
Browse latest Browse all 13

Trending Articles