2015-07-21 1 views
1

Je voudrais faire un tableau associatif en utilisant PHP pour la boucle à utiliser dans la méthode Yii2 map().Comment faire un tableau associatif en utilisant PHP pour la boucle à utiliser dans Yii 2 tableau map()?

Le tableau ressemblera à soufflet Format-

$listArray = [ 
    ['id' => '1', 'name' => 'Peter/5'], 
    ['id' => '2', 'name' => 'John/7'], 
    ['id' => '3', 'name' => 'Kamel/9'], 
]; 

L'identifiant et le nom sera changé par chaque itération de la boucle. Ici, le nom conservera toujours une valeur personnalisée après un calcul dans la boucle.

Enfin, la liste sera utilisée dans la méthode carte() comme la manière suivante

$listData=ArrayHelper::map($listArray,'id','name'); 

Je peux utiliser la méthode map() directement après l'utilisation du Active Record pour trouver le tableau de liste et ensuite utiliser que sur la carte() méthode. Mais cela ne me permet pas d'utiliser une valeur personnalisée pour l'attribut name.

$listArray = UserList::find() 
     ->where(['status' => 1]) 
     ->orderBy('name') 
     ->all(); 

$listData=ArrayHelper::map($listArray,'id','name'); 

Comment y parvenir? Exemple de code source direct serait vraiment génial pour moi.

Merci d'avance.

+0

Si vous pouvez parcourir les lignes renvoyées, vous pouvez facilement créer un tableau associatif dans chaque boucle. Je ne suis pas trop familier avec Yii2 mais j'imagine que les principes sont les mêmes et que vous pourriez simplement utiliser PHP natif pour cela. –

+0

Si vous aidez s'il vous plaît à écrire le code pour faire le tableau associatif qui serait vraiment utile pour moi. Je pourrais écrire pour un tableau générique PHP avec() ou {} mais pas pour utiliser [[], []] de cette façon. Merci. –

+0

@ xerxes333 répondu ci-dessous le long de ce que je parlais. –

Répondre

3

Je suppose que vous voulez interroger un ActiveRecord pour les données puis transférer les données dans un tableau simple.

$listData = []; 

$listArray = UserList::find() 
    ->where(['status' => 1]) 
    ->orderBy('name') 
    ->all(); 

foreach($listArray as $user){ 
    $customName = $user->name . $this->someCalculation(); 
    $listData[] = ["id" => $user->id, "name" => $customName]; 
} 

Ou vous pouvez utiliser la classe ArrayHelper comme ceci:

$listArray = UserList::find() 
    ->where(['status' => 1]) 
    ->orderBy('name') 
    ->all(); 

$listData = ArrayHelper::toArray($listArray , [ 
    'app\models\UserList' => [ 
     'id', 
     'name' => function ($listArray) { 
      return $listArray->word . strlen($listArray->word); // custom code here 
     }, 
    ], 
]); 
+0

Cela a fonctionné comme prévu! Merci. –

1

Je pense que la meilleure façon de le faire en définissant la règle de calcul personnalisé dans le modèle UserList comme:

public function getCustomRuleForUser(){ 
    // Do what ever you want to do with your user name. 
    return $this->name.'Your custom rule for name'; 

} 

Et utiliser comme:

$userList = UserList::find()->all(); 
    $listData=ArrayHelper::map($userList,'id','customRuleForUser'); 

Maintenant, vous avez votre règle personnalisée pour la liste des noms d'utilisateur dans $listData.