ArrayHelper::map()是将数据库结果转为下拉选项的唯一可靠方法,它按指定字段提取键值对,支持点语法和回调函数,避免array_column()不支持对象及重复键覆盖的问题。

ArrayHelper 怎么把数据库结果转成下拉选项?
这是最常踩坑的场景:你查出一堆 ActiveRecord 对象或数组,想喂给 dropDownList(),但直接传会报错或显示空白。根本原因是 Yii 表单组件只认「键值对」格式(['1' => '北京', '2' => '上海']),而查询结果是对象列表或关联数组嵌套结构。
-
ArrayHelper::map()是唯一可靠解法,它能按字段抽取出 key-value 映射,第三个参数支持点语法(如'profile.name')或回调函数 - 别用
array_column()替代 —— 它不处理对象,且对重复 key 会覆盖(比如两个用户 id 都是'0',后者直接丢掉) - 如果要多级分组(如按分类展示城市),得先用
ArrayHelper::index()+ArrayHelper::multisort()预处理,不能指望map()一步到位
示例:
$users = User::find()->select(['id', 'name', 'status'])->asArray()->all(); $forDropdown = ArrayHelper::map($users, 'id', 'name'); // ✅
StringHelper 截断中文字符串为什么总乱码或砍半?
直接用 substr() 或 mb_substr() 手动截断,在 Yii2 里属于“自找麻烦”。StringHelper::truncate() 和 StringHelper::truncateWords() 内部已做 UTF-8 安全判断,但很多人忽略它的默认行为:
-
StringHelper::truncate($str, 20)默认在末尾加'...',且严格按字节截(不是字符),对中文可能切在 UTF-8 中间字节,导致乱码 —— 必须显式传['suffix' => '…', 'encoding' => 'UTF-8'] - 如果原文含 HTML 标签(比如从富文本取摘要),先用
HtmlPurifier清洗,再截断;否则<p>你好</p>可能被截成<p>你好<,破坏页面结构 - 性能上,
truncateWords( $str, 10 )比truncate( $str, 50 )更慢,因为它要按空格/标点切词,中文无空格时退化为字符计数
Url::to() 和 Url::toRoute() 到底该用哪个?
90% 的路由拼接错误,都源于混淆这两个方法。它们根本不是“可互换的替代品”,而是面向不同场景的接口:
-
Url::to()接收「路径字符串」或「数组」,自动识别是否为别名(@web)、相对路径(images/logo.png)或路由数组(['site/index'])。适合静态资源、外部链接、带参数的完整 URL 构造 -
Url::toRoute()**只接收路由数组**(如['post/view', 'id' => 123]),强制走路由解析,不支持别名或文件路径。它是控制器内跳转、生成 AJAX 地址的首选 - 常见错误:在视图里写
Url::to(['@web/uploads/file.pdf'])——@web是别名,to()能处理,但toRoute()会直接报错Invalid Route
Html::activeTextInput() 为啥表单提交后不保留值?
这问题几乎都出在「没传模型实例」或「属性名写错」。和原生 textInput() 不同,active* 系列方法必须绑定一个有效的 Model 对象,否则无法自动回填、验证和渲染错误信息。
- 检查传入的第一个参数是不是
$model实例,而不是数组或 null;第二个参数必须是模型中真实存在的属性名(区分大小写),比如'username'而不是'user_name' - 如果模型来自
load()后未验证($model->validate()),或验证失败但没触发 error summary,active*仍会渲染,但值为空 —— 这不是助手类的问题,是业务逻辑断层 - 不要为了“省事”在循环里反复 new Model;大批量表单建议用
TabularInput扩展,原生active*不处理数组索引嵌套(如items[0][name])
复杂点在于:这些助手类本身不维护状态,也不参与生命周期。它们只是“工具刀”,切得准不准,全看你递进去的数据干不干净、上下文对不对。漏掉一次 asArray(),少传一个命名空间,或者把 Html::encode() 和 HtmlPurifier 搞混,结果就差很远。










