[PHP] array selon string

Résolu/Fermé
monkey_monk Messages postés 641 Date d'inscription mercredi 1 juillet 2009 Statut Membre Dernière intervention 10 août 2012 - 27 mai 2012 à 12:25
monkey_monk Messages postés 641 Date d'inscription mercredi 1 juillet 2009 Statut Membre Dernière intervention 10 août 2012 - 11 juin 2012 à 21:04
Bonjour,
je sèche depuis 2jours sur le problème suivant :

J'ai une String comme ceci :
css/
	reset.css
	style.css
img/
js/
	lib/
		jquery.js
	script.js
index.php


et je voudrais générer un Array comme celui-ci :
Array
(
    [js/] => Array
        (
            [lib/] => Array
                (
                    [jquery.js] => 
                )
            [script.js] => 

        )
    [index.php] => 
)


Voici mon code PHP :
class Structurer{
	public function parse(){
		$output = array();
		$level = 0;
		$currentFolder = '';
		
		function throughtLevels(&$arr, $key, $newKey, $newValue){
			if(is_array($arr)){
				foreach($arr as $k => $v){
					if($k == $key){echo 'ok';
						if(is_array($arr[$k]))	$arr[$k] = array_merge($arr[$k], array($newKey => $newValue));
						else	$arr[$k] = array($newKey => $newValue);
					}
					else	throughtLevels($arr[$k], $key, $newKey, $newValue);
				}
			}
		} // throughtLevels
		while($this->moveToNextLine()){
			$curl = '';
			
			if(preg_match_all('#\t#', $this->currentLine, $n)){
				$this->currentLine = str_replace("\t", '', $this->currentLine);
				$level = count($n[0]);
			}
			else $level = 0;
			
			if(preg_match_all('#\[(.*)\]#', $this->currentLine, $com)){
				$this->currentLine = str_replace($com[0], '', $this->currentLine);
				$curl = implode('', $com[1]);
			}
			
			if(preg_match('#\/#', $this->currentLine)){
				if($level > 0)	throughtLevels($output, $currentFolder, $this->currentLine, array());
				else	$output[$this->currentLine] = array();
				
				$currentFolder = $this->currentLine;
			} else {
				if(!empty($this->currentLine)){
					if($level > 0){throughtLevels($output, $currentFolder, $this->currentLine, $curl);}
					else	$output[$this->currentLine] = $curl;
				}
			}
		}
		
		echo '<pre>' . print_r($output, 1) . '</pre>';
	} // parse(value)

	private function moveToNextLine(){
		if($this->currentLineNum >= count($this->lines) -1)	return false;
		$this->currentLine = $this->lines[++$this->currentLineNum];
		return true;
	} // moveTonextLine
	
	
	private static function cleanup($value){
		$value = str_replace(array("\r\n", "\r"), "\n", $value);
		$value = preg_replace('#/\*[^*]*\*+([^/][^*]*\*+)*/#', '', $value);
		$value = preg_replace('#^\n#', '', $value);
		
		return $value;
	} // cleanup(value)
	
	
	public function __construct($value){
		$this->base = dirname(__FILE__);
		$this->currentLineNb = -1;
		$this->currentLine = '';
		$this->lines = explode("\n", self::cleanup($value));
		
		$this->parse();
	} // __construct(value)
	
	
	private $lines = array();
	private $currentLineNum = -1;
	private $currentLine = '';
} // Structurer
$input = <<<EOT
css/
	reset.css
	style.css
img/
js/
	lib/
		jquery.js
	script.js
index.php
EOT;
$arr = new Structurer($input);


Pour le moment, le code ci-avant génère l'Array ci-après :
Array
(
    [js/] => Array
        (
            [lib/] => Array
                (
                    [jquery.js] => 
                    [script.js] => 
                )

        )
    [index.php] => 
)


Et je suis donc dans la panade car "script.js" devrait être au même niveau que "lib/"...

Un cerveau mieux construit que le mien pourrait-il me venir en aide ?
Je suis au bord de la crise de nerf ! :-P

Merci !!
A voir également:

2 réponses

monkey_monk Messages postés 641 Date d'inscription mercredi 1 juillet 2009 Statut Membre Dernière intervention 10 août 2012 128
27 mai 2012 à 16:43
Personne pour me donner un coup de pouce ?
Siouplé, même une idée nouvelle, je suis preneur ! ;-)
0
monkey_monk Messages postés 641 Date d'inscription mercredi 1 juillet 2009 Statut Membre Dernière intervention 10 août 2012 128
11 juin 2012 à 21:04
Résol une toute autre méthode... merci quand même ! ;-)
0