Tableau multi-dimmension: recupérer clé

gui
Eléphant du PHP | 100 Messages

26 mars 2010, 11:02

:cry:
Modifié en dernier par gui le 26 mars 2010, 11:22, modifié 1 fois.

gui
Eléphant du PHP | 100 Messages

26 mars 2010, 11:19


public function subsequence($sequence) {

		$arr=array();
		$jen="/home/Desktop/Seq-matrice/data.fasta";
		$pro=fopen($jen,"w+");
		fwrite($pro,$this->id);
		fwrite($pro,$sequence."\n");
		fclose($pro);
		chmod($jen,0777);

		for($a=0;$a<=strlen($sequence)-$this->b;$a++){                       

			$this->files=substr($sequence,$a,$this->b);

           		$align=array(0=>$this->files);	

			//print_r($align);  

		
			#msf

			$msa=new Msa($align);
			$msa->toMSF("/opt/lampp/htdocs/profils/test.msa");
		
	$file="/opt/lampp/htdocs/profils/test.msa";
			$msf=file_get_contents("$file");
			#echo $msf;
		

			#pfmake

			$pfmake=new pfMake($file);			

			$pfmake->setAlignmentMode(-1);

			$pfmake->setLinearMode();

			$pfmake->execute();

			#echo $prf;

					

			$pfmake->autoscale();

			$prf=$pfmake->getProfile();
			
			$profil=file_get_contents("$prf");			
			#echo $profil;
		

			

			#  pfsearch
			$pfsearch=new pfSearch($prf,$jen);

			$pfsearch->execute();
			$pr=$pfsearch->getResult();

			#$prr=$pfsearch=file_get_contents($pr);
			#echo $pr;
			$tab[]=array ($msf,$profil,$pr); //Voilà c'est ce tableau que j'aimerai autoincrémenter je ne peux pas mettre une boucle for car la clé 
                        #print_r ($tab);                        //serai réinitialiser à chaque fois que je repasse dans la fonction subsequence
			
		}
		
		#Recherche séquence significative
		$score=new score();
		$score->execute();
		$mx=$score->getResult();
		echo $mx;
		
		#Placement de tous les resultats dans un seul fichier		
		$data=file_get_contents("$mx");		
		$jon="/home/Desktop/Seq-matrice/final.txt";
		
		#Renvoie clé de $mx (valeur maximale)
		function recursive_array_search($needle,$haystack) {
    			foreach($haystack as $key=>$value) {
       			 $current_key=$key;
        			if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value))) {
			  	  return $current_key;
				}
		    	}
		return false;
		}
		$found = recursive_array_search($mx,$tab);
		var_dump($found);  // C'est donc à l'appel de cette fonction qui me renvoie l'erreur précédente, ce que je veux c'est recupérer la clé correspondant à la valeur de $mx dans le tableau $tab, de tout facon tant que mon tableau $tab ne sera pas auto incrémenté, la valeur retourné devrait être 0.
	

		
	}



Voilà vous avez une bonne partit de mon code je ne comprend pas pourquois je ne peux pas appeler cette fonction, en attendant je cherche un moyen de d'auto incré mon $tab, si vous avez des idées n'hésité pas.
Merci pour tout

Mammouth du PHP | 804 Messages

26 mars 2010, 11:34

Bonjour,

array_search("$mx['2']",$tab);

les cotes dans une chaine vont créer une erreur je pense, j'aurai plutôt codé comme ca

array_search("$mx[2]",$tab);

gui
Eléphant du PHP | 100 Messages

26 mars 2010, 13:26

Bonjour,
Au debut j'étais partis sur cette fonction pour récupérer ma clé (c'étati exactement la meme que la tienne) mais elle ne fonctionne pas, c'est la fonction que je dois utiliser mais celle ci n'est pas appelable, je ne comprend pas pourquoi

Mammouth du PHP | 804 Messages

26 mars 2010, 15:10

Si je comprends bien tu essai de généré dynamiquement un tableau associatif, à partir d'une requête ou d'un forech supérieur je suppose

Peu-tu me montrer un exemple des variables suivante $msf, $profil, $pr

dog

gui
Eléphant du PHP | 100 Messages

26 mars 2010, 16:55

Lorsque je fais un print_r ($tab); il me renvoie donc le tableau $tab non incrémenté, les variables qu'il contient sont de simple chaine de caractère plus ou moins long qui elles s'incrémentent bien au sein de $tab. Le tableau est donc remplis au fur et à mesure de l'avancement de mon programme.
En réalité ce tableau me permet d'associer des variables à d'autres, car le contenue de $msf va par l'intermediaire de fonction devenir $profils et $profils va devenir $pr.
Je place donc à chaque fois ces 3 variables dans un tableau pour pouvoir récupérer les profils et msf à parir de certaint $pr. pour cela il faut que à partir de $pr je récupére la clé qui lui corespond. Voila j'en suis toujours au même point et je n'avance pas

gui
Eléphant du PHP | 100 Messages

29 mars 2010, 09:50

:( personne ne sait

ViPHP
ViPHP | 5462 Messages

29 mars 2010, 09:58

c'est un peu flou les explications,
comment est ton entrée (a quoi ressemble ton fichier a la base) ?
comment tu veux ta sortie (a quoi va ressemble ton tableau a fin) ?

gui
Eléphant du PHP | 100 Messages

29 mars 2010, 10:26

Je comprend bien que je m'explique mal je reprend donc,
Je remplis mon tableau $tab[]=array ($msf,$profil,$pr);
Le tableau se remplis bien voici un exemple lorsque je le print ( je sais c'est un peu violent)

Array ( [0] => Array ( [0] => MSF: 10 Type: P Check: 0 .. Name: sequence_1 Len: 10 Check: 1 Weight: 1.00 // sequence_1 MPHTLWMVWV [1] => ID SEQUENCE_PROFILE; MATRIX. AC ZZ99999; DT Mon Mar 29 10:12:48 2010 DE Generated from MSF file: '/opt/lampp/htdocs/profils/test.msa'. MA /GENERAL_SPEC: ALPHABET='ABCDEFGHIKLMNPQRSTVWYZ'; LENGTH=10; MA /DISJOINT: DEFINITION=PROTECT; N1=2; N2=9; MA /NORMALIZATION: MODE=1; FUNCTION=LINEAR; R1=0.0000000; R2=0.0100000; TEXT='No_units'; MA /CUT_OFF: LEVEL=0; SCORE=850; N_SCORE=8.5; MODE=1; TEXT='!'; MA /CUT_OFF: LEVEL=-1; SCORE=650; N_SCORE=6.5; MODE=1; TEXT='?'; MA /DEFAULT: M0=-10; D=-20; I=-20; B0=*; B1=*; E0=*; E1=*; MI=-105; MD=-105; IM=-105; DM=-105; MA /I: B0=0; B1=0; BI=-105; BD=-105; MA /M: SY='M'; M=-10,-20,-20,-30,-20,0,-20,0,20,-10,20,60,-20,-20,0,-10,-20,-10,10,-20,0,-10; MA /M: SY='P'; M=-10,-20,-40,-10,0,-30,-20,-20,-20,-10,-30,-20,-20,90,-10,-20,-10,-10,-30,-30,-30,-10; MA /M: SY='H'; M=-20,0,-30,0,0,-20,-20,100,-30,-10,-20,0,10,-20,10,0,-10,-20,-30,-30,20,0; MA /M: SY='T'; M=0,0,-10,-10,-10,-10,-20,-20,-10,-10,-10,-10,0,-10,-10,-10,20,50,0,-30,-10,-10; MA /M: SY='L'; M=-10,-30,-20,-30,-20,10,-30,-20,20,-30,50,20,-30,-30,-20,-20,-30,-10,10,-20,0,-20; MA /M: SY='W'; M=-20,-40,-50,-40,-30,10,-20,-30,-20,-20,-20,-20,-40,-30,-20,-20,-40,-30,-30,150,30,-20; MA /M: SY='M'; M=-10,-20,-20,-30,-20,0,-20,0,20,-10,20,60,-20,-20,0,-10,-20,-10,10,-20,0,-10; MA /M: SY='V'; M=0,-30,-10,-30,-30,0,-30,-30,30,-20,10,10,-30,-30,-30,-20,-10,0,50,-30,-10,-30; MA /M: SY='W'; M=-20,-40,-50,-40,-30,10,-20,-30,-20,-20,-20,-20,-40,-30,-20,-20,-40,-30,-30,150,30,-20; MA /M: SY='V'; M=0,-30,-10,-30,-30,0,-30,-30,30,-20,10,10,-30,-30,-30,-20,-10,0,50,-30,-10,-30; MA /I: E0=0; E1=0; IE=-105; DE=-105; CC /GENERATED_BY="/home/guillaume/Desktop/pftools/pftools/pfmake -1 /opt/lampp/htdocs/profils/test.msa /home/guillaume/Desktop.."; // [2] => /tmp/resultpfxnML42 ) )

On voie bien que les incrémentations des différentes variables sont bonnes: 0, 1 et 2.
En revanche, celle du tableau elle même reste toujour à 0 : Array ( [0] => Array ( [0].....

Je n'arrive pas à l'auto-incrémenter.
Donc à partir de ce tableau dont le remplissage est correct, je cherche à comparer la valeur d'une variable $mx avec le $pr de mon tableau et si celle ci sont les mêmes, recupérer la clé de $tab.
Par exemple dans ce cas là je cherche à voir si $mx est égal à $pr soit : "/tmp/resultpfxnML42". Si c'est le cas j'aimerai qu'il m'affiche la clé de $tab de ce cas là c'est 0 car l'auto incrémentation ne fonctionne pas.

J'ai donc recupérer la fonction recursive_array_search que j'ai adapté à mon cas en placant en argument $mx (la valeur que je cherche à comparer au valeur de mon tableau $tab).


#Renvoie clé de $mx (valeur maximale)
		function recursive_array_search($needle,$haystack) {
    			foreach($haystack as $key=>$value) {
       			 $current_key=$key;
        			if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value))) {
			  	  return $current_key;
				}
		    	}
		return false ;
		}
		$found = recursive_array_search($mx,$tab);
		var_dump($found);
 


Le var_dump me renvoie "bool(false)", la fonction n'est donc pas executé.

Voilà je pense que les 2 problèmes sont en partit liés, je ne voie pas comment ressoudre ce problème car tout le reste fonctionne très bien.
Merci pour l'attention accordée
Cordialement

ViPHP
ViPHP | 5462 Messages

29 mars 2010, 10:31

tu veux l'auto-incrémenter par rapport a quoi ?

EDIT : le problème doit venir t'as boucle elle fait qu'un seul tour

gui
Eléphant du PHP | 100 Messages

29 mars 2010, 10:46

En fait le tableau est remplis au fur et à mesure des toursde boucle, j'aurai donc effectivement put l'incrémenter avec une varaible type $i=o et $i++
Mais dans mon cas c'est impossible cette boucle placée au sein d'une fonction est appelé plusieurs fois et si je defini ma variable d'incrémentation$i=0 ou autre, à chaque appel de fonction il me remplacera l'ancien tableau par un nouveau. Je souhaite donc qu'il y est une valeur toujours différente pour $tab[] : A chaque rappel de la fonction, l'incrémentation se poursuive à partir de là ou elle a été laissé.

ViPHP
ViPHP | 5462 Messages

29 mars 2010, 10:53

c'est pourtant ce que tu fais avec
for($a=0;$a<=strlen($sequence)-$this->b;$a++)
après c'est normale que ca incrémente pas non plus faut déclarer ton tableau au niveau de ta class...

gui
Eléphant du PHP | 100 Messages

29 mars 2010, 11:06

je le déclare donc au niveau de public function __construct?
Avec $tab[];
Le problème est pour l'apeller non?

ViPHP
ViPHP | 5462 Messages

29 mars 2010, 11:16

tu fait un

public $tab = array();


pour l'apeller c'est
$this->tab

gui
Eléphant du PHP | 100 Messages

29 mars 2010, 11:17

Ok merci beaucoup je regarde