项目场景:
在ThinkPHP 版本6.0.9 中使用 flip方法,交换数据中的键和值
问题描述:
//控制器
$res=Db::table('user')->where('id',1)->find();
$res->flip();
//或
$res=Db::table('user')->where('id',1)->select();
$res->flip();
会提示错误:Call to a member function flip() on array
或 array_flip(): Can only flip string and integer values, entry skipped
原因分析:
由原代码可以看出,该方法使用 PHP函数array_flip(array); 用于反转/交换数组中的键名和对应关联的键值,该方法只支持一维数组,显然 select() 肯定是不行的,然而find() 也是不行的,因为 $this->items 会提示错误 Call to a member function flip() on array,所以觉得这个方是有问题的。
//vendor\topthink\think-helper\src\Collection.php
/**
* 交换数组中的键和值
*
* @access public
* @return static
*/
public function flip()
{
return new static(array_flip($this->items));
}
解决方案:
重写ThinkPhp6 flip 方法
/**
* 交换数组中的键和值
*
* @access public
* @return static
*/
public function flip()
{
foreach ($this->items as $k=>$item) {
$res[$k]=array_flip($item);
}
return new static($res);
}
总结:
不推荐修改ThinkPHP6 的核心方法,但没有找到具体的原因,如果有更好的方法,望指出。