8722 sujets

Développement web côté serveur, CMS

C'est RÉSOLUT cf dernier post! Smiley sweatdrop

Bien le bonjour a tous,

Je suis en train de développer un script ftp complet et autonome et je coince sur un truc a la con, je m'explique :

J'appel en CURL ftp_rawlist et met progressivement à jour un fichier.
Je récupère donc et parse de manière récursive le contenus d'un répertoire vers un tableau php classique pour le moment ainsi :

$t = array (
	0 => array([i]// un répertoire [/i]
		'type' => 'dir',[i]//=> type d’élément répertoire/image...[/i]
			'dir' => 'a',//=> chemin du répertoire
		'name' => 'mondossier',//=> nom du répertoire
		'path' => array()//=>[i]contenus du répertoire...[/i]
	)
	1 => array([i]// un fichier simple ici[/i]
		'type' => 'file',
		'dir' => 'a',
		'name' => 'mon_fichier.jpeg',
	)
	2 => array([b]// un autre répertoire ici MAIS je le veux dans le contenus 'path' du premier repertoire[/b]
		'type' => 'dir',
		'dir' => 'a/mondossier',
		'name' => 'mondossier2',
		'path' => array(...)
	)
)


Vous l'aurez deviné en voyant ce bout de code, je souhaite mettre $t[3] dans $t[1]['path']
et je n'ai a ma disposition qu'un élément d'identification : $t[3]['dir']... et qui correspond logiquement a $t[1]['dir'].'/'.$t[1]['name']

Du coup je me suis aventuré a faire une boucle récursive pour mettre a jour le tout, et c'est là que je coince... impossible!!

Bon je suis parfaitement capable de le faire avec un xml avec la fonction xpath et ensuite reconvertir l'xml en un tableau php... mais c'est un peu con de tourner à gauche pour revenir à droite non???

j'ai bien tenté de le faire avec eval mais je ne l'utilise jamais et la fonction ne veux rien savoir :
avec une fonction basique de recherche j'ai dégoté les id cible pour ensuite générer ceci :

$ids=array('0');
$e = "$t";// et pareil si je met $e = '$t';
foreach($ids as $i) $e.="[$i]['path']";
$e.=";";
eval($e);
var_dump($e) // => retourne : Array[0]['path']; avec un jolis warning...


Une idée???
Bon je suis complétement naze et ceci explique surement cela, m'enfin !!! Smiley bawling

d’ailleurs une question subsidiaire : php et c++ ont bien la même façons de fonctionner sur certains aspect... : ???

$a=3;
$b=&$a;

echo $b;// retourne 3
$b = 8;
echo $a;//retourne 8


on est dac le & est un pointeur dans ce contexte??
Donc ni une ni deux, dans ma fonction de recherche récursive je stocke le pointeur dans une variable globale pour ensuite me permettre de maj mon tableau en externe...
Ben figurez vous que : impossible également.... Smiley biggol

je réussit bien a récupérer l'étiquette de ma cible $t[1]['path'] dans la variable globale, et donc le contenus et les propriétés. un var_dump me le prouve bien.

Et quant je met a jour la variable globale pointant vers $t[1]['path'], pas de soucis ça prend bien la chose. (et écrase mon pointeur?)(un var_dump sur la var globale le prouve encore)

yes!! un var_dump sur le tableau mère $t??? Smiley langue
mais là le tableau mère reste comme a l'origine, inchangé!!! Smiley bawling
Modifié par bolchevian (09 Jan 2014 - 07:10)
Pour illustrer mon dernier propos j'ai tenté ceci :

$t = array(
	0 => array(
		'type' => 'dir',
		'dir' => 'c'
	),
	1 => array(
		'type' => 'dir',
		'dir' => 'a',
		'path' => array(
			0 => array(
				'type' => 'dir',
				'dir' => 'a/b',
				'path' => array(132)
			),
			1 => array(
				'type' => 'dir',
				'dir' => 'a/zf',
				'path' => array(456)
			)
		)
	)
);

$GLOBALS ['flag'] = false;
global $a;

function search_path($array, $path) {
	if($GLOBALS ['flag'] == false) {
		foreach($array as $id=>$value) {
			if($value['type']=='dir' && $path==$value['dir']) {
				$GLOBALS ['flag'] = &$value;
				$a = &$value;
				break;
			} else if(isset($value['path'])) {
				search_path($value['path'], $path);
			}
		}
	}
}
search_path($t, 'a/zf');


var_dump($GLOBALS ['flag']); /* retourne :
array
  'type' => string 'dir' (length=3)
  'dir' => string 'a/zf' (length=4)
  'path' => 
    array
      0 => int 456
*/
var_dump($a);// retourne null

var_dump($GLOBALS ['flag']['path']);// retourne bien array(0=>int 456) 

$GLOBALS ['flag']['path'] = array(123maj);
var_dump($GLOBALS ['flag']['path']);// retourne bien array(0=>string 123maj) 

echo "<pre>";
print_r($t);/* retourne : le tableau initial ...*/ [fache]
echo "</pre>"; 
bwarrrrf!!

C'est bon!! Vive la fatigue et la recherche de sollution alambiquées!!!
c'est bien ce qu'il me semblais, c'est tout simple donc forcement on s'embarque dans des chose insolubles Smiley lol


$t = array(
	0 => array(
		'type' => 'file',
		'dir' => 'c'
	),
	1 => array(
		'type' => 'dir',
		'dir' => 'a/try',
		'path' => array(7898987)
	),
	2 => array(
		'type' => 'dir',
		'dir' => 'a',
		'path' => array(
			0 => array(
				'type' => 'dir',
				'dir' => 'a/b',
				'path' => array(132)
			),
			1 => array(
				'type' => 'dir',
				'dir' => 'a/zf',
				'path' => array(456)
			)
		)
	)
);
// petit exercice de mémoire [cligne]
function inc_i($i=0, $m=20) {
	if($i<$m) {
		//echo $i.'<br/>';
		$i = inc_i($i+1);
	}
	return $i;
}
echo inc_i().'<br/>';
// la solution
function inc_array($tableau,$path,$mynewtab,$is=false) {
	
	$ntab=array();
	if(!$is) {
		foreach($tableau as $i=>$v) {
			if($v['type']=='dir' && $v['dir']==$path) {
				$tmp =$v;
				$tmp['path'] = inc_array($v['path'],$path,$mynewtab,true);
				$ntab[]=$tmp;
			} else if($v['type']=='dir' && $v['dir']!=$path) {
				$tmp =$v;
				$tmp['path'] = inc_array($tableau[$i]['path'],$path,$mynewtab);
				$ntab[]=$tmp;
			} else {
				$ntab[]=$v;
			}
		}
	} else {
		$ntab[]=array_merge($tableau,$mynewtab);
	}
	return $ntab;
}
$mynewtab=array(1212132654653);
echo "<pre>";
print_r(inc_array($t,'a/zf',$mynewtab));
echo "</pre><br>";



Il suffisait de se recoller les deux neurones!! Smiley biggol
Modifié par bolchevian (09 Jan 2014 - 07:17)