Alimenter un array via array_push

Eléphant du PHP | 186 Messages

05 juil. 2010, 10:22

Bonjour!

Je rencontre des difficultés à obtenir le résultat souhaité dans l'alimentation d'un array

Pour la présentation du contexte :
J'ai deux informations principales issues d'une BDD, une ou plusieurs catégories d'atelier et un ou plusieurs ateliers par catégorie

A l'heure actuelle, j'ai les deux informations dans une table atelier par l'intermediaire des champs id_atelier et categ_id (ici en clé étrangère)

Imaginons les entrées de cette table comme suit:

id_atelier categ_id
1 1
2 4
3 2
4 1
5 4

Le resultat que j'essaie d'obtenir est le suivant :
[categ] [0] => 1, [1] => 4, [2] => 2 ; [atelier] [0] => 1, 4, [1] => 2, 5, [2] => 3
J'avais pensé à quelque chose comme ça :
if($array=='' || ($array!='' && !in_array($row_atelier_termine['categ_id'],$array['categ']))){
    array_push($array['categ'], $row_atelier_termine['categ_id']);
    array_push($array['atelier'], $row_atelier_termine['atelier_id']);
}
elseif($array!='' && in_array($row_atelier_termine['categ_id'], $array['categ'])){
	$cle=array_keys($array, $row_atelier_termine['categ_id']);			
	$cle=$cle[0];
	$array['atelier'][$cle]=array();
	array_push($array['atelier'][$cle],$row_atelier_termine['atelier_id']);
}
Le souci, c'est que cela ne rajoute pas les entrées mais les écrase.

Merci pour toute aide apportée.

ViPHP
ViPHP | 3607 Messages

06 juil. 2010, 12:23

Et hop!
$resultsBdd = array(
  array('id_atelier'=>1, 'categ_id'=>1),
  array('id_atelier'=>2, 'categ_id'=>4),
  array('id_atelier'=>3, 'categ_id'=>2),
  array('id_atelier'=>4, 'categ_id'=>1),
  array('id_atelier'=>5, 'categ_id'=>4)
);

$resultsPhp = array('categ'=>array(),'atelier'=>array());

foreach($resultsBdd as $line){

  // si la catégorie n'est pas encore enregistrée
  if(!in_array($line['categ_id'],$resultsPhp['categ'])){
    $resultsPhp['categ'][]=$line['categ_id'];
  }

  // on récupère l'indice du tableau des catégories
  $cat_key = array_search($line['categ_id'],$resultsPhp['categ']);
  
  // si l'atelier n'est pas encore enregistré
  if(!in_array($line['id_atelier'],$resultsPhp['atelier'][$cat_key])){
    $resultsPhp['atelier'][$cat_key][]=$line['id_atelier'];
  }
}

var_dump($resultsBdd,$resultsPhp);
;)
Par contre j'aimerais que tu me dises si tu ne comprends pas, que ça ne soit pas (trop) du tout cuit!

ViPHP
ViPHP | 5462 Messages

06 juil. 2010, 13:32

Et hop!
$resultsBdd = array(
  array('id_atelier'=>1, 'categ_id'=>1),
  array('id_atelier'=>2, 'categ_id'=>4),
  array('id_atelier'=>3, 'categ_id'=>2),
  array('id_atelier'=>4, 'categ_id'=>1),
  array('id_atelier'=>5, 'categ_id'=>4)
);

$resultsPhp = array('categ'=>array(),'atelier'=>array());

foreach($resultsBdd as $line){

  // si la catégorie n'est pas encore enregistrée
  if(!in_array($line['categ_id'],$resultsPhp['categ'])){
    $resultsPhp['categ'][]=$line['categ_id'];
  }

  // on récupère l'indice du tableau des catégories
  $cat_key = array_search($line['categ_id'],$resultsPhp['categ']);
  
  // si l'atelier n'est pas encore enregistré
  if(!in_array($line['id_atelier'],$resultsPhp['atelier'][$cat_key])){
    $resultsPhp['atelier'][$cat_key][]=$line['id_atelier'];
  }
}

var_dump($resultsBdd,$resultsPhp);
;)
Par contre j'aimerais que tu me dises si tu ne comprends pas, que ça ne soit pas (trop) du tout cuit!
je me retrouve avec ca moi :|

Code : Tout sélectionner

Warning: in_array() expects parameter 2 to be array, null given in D:\www\test\index.php on line 24 Notice: Undefined offset: 1 in D:\www\test\index.php on line 24 Warning: in_array() expects parameter 2 to be array, null given in D:\www\test\index.php on line 24 Notice: Undefined offset: 2 in D:\www\test\index.php on line 24 Warning: in_array() expects parameter 2 to be array, null given in D:\www\test\index.php on line 24

ViPHP
ViPHP | 3607 Messages

06 juil. 2010, 13:35

Ah autant pour moi, il faut rajouter une petit test:
  // si l'atelier n'est pas encore enregistré
  if(!isset($resultsPhp['atelier'][$cat_key]) || !in_array($line['id_atelier'],$resultsPhp['atelier'][$cat_key])){
    $resultsPhp['atelier'][$cat_key][]=$line['id_atelier'];
  }

ViPHP
ViPHP | 5462 Messages

06 juil. 2010, 14:08

sinon on peux faire ca avec array_merge_recursive
$resultsBdd = array(
  array('id_atelier'=>1, 'categ_id'=>1),
  array('id_atelier'=>2, 'categ_id'=>4),
  array('id_atelier'=>3, 'categ_id'=>2),
  array('id_atelier'=>4, 'categ_id'=>1),
  array('id_atelier'=>5, 'categ_id'=>4)
);

$resultsPhp = array('categ'=>array(),'atelier'=>array());

foreach($resultsBdd as $line)
{
	$resultsPhp['categ'][] = $line['categ_id'];
	$resultsPhp['atelier'] = array_merge_recursive($resultsPhp['atelier'], array(':' . $line['categ_id'] => $line['id_atelier']));
}

$resultsPhp['categ'] 	= array_values(array_unique($resultsPhp['categ']));
$resultsPhp['atelier'] 	= array_values($resultsPhp['atelier']);

print_r($resultsBdd);
print_r($resultsPhp);

Eléphant du PHP | 186 Messages

06 juil. 2010, 17:39

Merci beaucoup pour tous ces éléments que je vais m'empresser de tester.

Je pense que ça ira pour la compréhension. J'ai plus un problème de connaissance dans les fonctions existantes et qui peuvent m'aider.

Merci encore.