如何使用PHP for循环在Yii 2数组map()中使用关联数组?

时间:2015-07-21 20:35:59

标签: php yii yii2 associative-array yii2-advanced-app

我想在Yii2 map()方法中使用PHP for循环创建一个关联数组。

数组看起来像下面的格式 -

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

将在循环的每次迭代中更改id和名称。在这里,在循环中进行一些计算后,名称将始终保持自定义值。

最后,列表将在map()方法中使用,如下所示

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

我可以在使用Active Record查找列表数组后直接使用map()方法,然后在map()方法中使用它。但它没有让我使用自定义值作为name属性。

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

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

怎么能实现这个目标?直接源代码示例对我来说真的很棒。

提前致谢。

3 个答案:

答案 0 :(得分:3)

我假设您想要查询ActiveRecord的数据,然后将数据传输到一个简单的数组中。

$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]; 
}

或者您可以像这样使用ArrayHelper类:

$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
        },
    ],
]);

答案 1 :(得分:1)

我认为通过在UserList模型中定义自定义计算规则来执行此操作的首选方法为:

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

}

并用作:

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

现在,您已在$listData中拥有用户名列表的自定义规则。

答案 2 :(得分:0)

$model_userprofile = UserProfile::find()->where(['user_id' => Yii::$app->user->id])->one();

        $model_userprofile1 = UserProfile::find()
            ->select('user_id')
            ->where(['group_id' => $model_userprofile->group_id])->all();

        $listData = [];

        foreach($model_userprofile1 as $user){
            $id = $user->user_id;
            $listData[] = ["id" => $id];
        }


        $dataProvider = new ActiveDataProvider
        ([
            'query' => User::find()
               ->select('id,username,email')
               ->Where(['id' => $listData])
               ->orderBy(['id' => SORT_DESC]),
            'pagination' => ['pagesize' => 15]]);

        return $this->render('index',['dataProvider'=> $dataProvider]);