Resolu : tableaux recalcitrants avec array_search

Eléphanteau du PHP | 17 Messages

23 oct. 2011, 11:06

Bonjour

Je cherche a partir de 2 arrays :
$ar1 = array('a', 'b', 'c', 'h', 'k');
$ar2 = array('a', 'c', 'e', 't');
a obtenir :
$idealar = array(
    'a' => 'a',
    'b' => '0',
    'c' => 'c',
    '0' => 'e',
    'h' => '0',
    'k' => '0',
    '0' => 't'
);
J'ai donc ecrit le code suivant :
$finalar = null;
$tmp = array_unique(array_merge($ar1, $ar2));
sort($tmp);
for($i=0; $i<count($tmp); $i++)
{
    if(array_search($tmp[$i], $ar1) && array_search($tmp[$i], $ar2)) 
$finalar[] = array($ar1[array_search($tmp[$i], $ar1)], $ar2[array_search($tmp[$i], $ar2)]);
    if(array_search($tmp[$i], $ar1) && !array_search($tmp[$i], $ar2))
$finalar[] = array($ar1[array_search($tmp[$i], $ar1)], '0');
    if(array_search($tmp[$i], $ar2) && !array_search($tmp[$i], $ar1)) 
$finalar[] = array('0', $ar2[array_search($tmp[$i], $ar2)]);
}
var_dump($finalar);
Qui me donne le resultat surprenant :

Code : Tout sélectionner

array(6) { [0]=> array(2) { [0]=> string(1) "b" [1]=> string(1) "0" } [1]=> array(2) { [0]=> string(1) "c" [1]=> string(1) "c" } [2]=> array(2) { [0]=> string(1) "0" [1]=> string(1) "e" } [3]=> array(2) { [0]=> string(1) "h" [1]=> string(1) "0" } [4]=> array(2) { [0]=> string(1) "k" [1]=> string(1) "0" } [5]=> array(2) { [0]=> string(1) "0" [1]=> string(1) "t" } }
Je ne comprends pas pourquoi array_search ne semble pas reconnaitre le 'a' alors qu'il reconnait le 'c' ???

Quelqu'un aurait-il une explication a cette bizarrerie ?

Merci
Modifié en dernier par baddev le 24 oct. 2011, 06:55, modifié 2 fois.
Le peu que je sais, c'est à mon ignorance que je le dois. Sacha Guitry

ViPHP
xTG
ViPHP | 7331 Messages

23 oct. 2011, 13:46

C'est à cause de l'auto-cast en booléen.
Un entier égal à 0 est égal à false.
Or le array_search() sur a renvoie la position de la valeur a qui est à l'index 0. ;)
<?php
$ar1 = array('a', 'b', 'c', 'h', 'k');
$ar2 = array('a', 'c', 'e', 't');
$arr_tmp = array_unique(array_merge($ar1,$ar2));
$arr_final = array();
foreach($arr_tmp as $val){
	if( array_search($val, $ar2) !== false )
		if( array_search($val, $ar1) !== false )
			$arr_final[$val] = $val;
		else
			$arr_final[] = $val;
	else
		$arr_final[$val] = 0;
}
var_dump($arr_final);
?>

Eléphanteau du PHP | 17 Messages

24 oct. 2011, 06:53

C'est à cause de l'auto-cast en booléen.
Un entier égal à 0 est égal à false.
Or le array_search() sur a renvoie la position de la valeur a qui est à l'index 0. ;)
Ca, c'etait facetieux.. :D
Merci doublement pour le code, qui est beaucoup plus simple que ce que j'avais fait ! ;)
Le peu que je sais, c'est à mon ignorance que je le dois. Sacha Guitry