PHP 数组 diff 的问题,求教。

2018-04-02 10:06:07 +08:00
 xuyl

写了个方法如下,不知道为啥, 最后返回的$apps的所有项的is_allow属性都是 1,也就是说 if 判断 in_array 全为 false

    public function apps()
    {
        $apps = App::all();
        $myApp = \Auth::user()->apps;
        $diffApp = $apps->diff($myApp);

        foreach ( $apps as &$app )
        {
            if ( in_array($app, (array)$diffApp) )
            {
                $app->is_allow = 0;
            } else {
                $app->is_allow = 1;
            }
        }
        return $apps;
    }

foreach处理前的$apps

[{
	"id": 1,
	"name": "应用 1"
}, {
	"id": 2,
	"name": "应用 2"
}, {
	"id": 3,
	"name": "应用 3"
}]

$diffApp的内容

[{
	"id": 1,
	"name": "应用 1"
}]

foreach处理后的$apps

[{
	"id": 1,
	"name": "应用 1",
	"is_allow": 1
}, {
	"id": 2,
	"name": "应用 2",
	"is_allow": 1
}, {
	"id": 3,
	"name": "应用 3",
	"is_allow": 1
}]
2303 次点击
所在节点    PHP
14 条回复
feiyuanqiu
2018-04-02 10:18:14 +08:00
把你的 diff 实现贴出来啊...
InternetExplorer
2018-04-02 10:22:57 +08:00
你的 is_array 写两个参数真的不报错吗
imn1
2018-04-02 10:26:05 +08:00
in_array 的顺序是不是搞错了?
b821025551b
2018-04-02 10:26:57 +08:00
in_array 里面,$app 是一个 object,(array)$diffApp 是一个二维数组包的 object,能一样可就出鬼了。
imn1
2018-04-02 10:28:36 +08:00
回上一条,我眼花了,好像是我搞错了
InternetExplorer
2018-04-02 10:34:44 +08:00
我...看花了,没睡醒
Vogan
2018-04-02 10:36:13 +08:00
The in_array function cannot compare objects.
xuyl
2018-04-02 10:37:15 +08:00
@feiyuanqiu diff 方法是 laravel 自带的...
InternetExplorer
2018-04-02 10:37:40 +08:00
从代码来看,应该是 laravel,$apps 应该是一个 App model 的数组,那么 foreach 循环里的 $app 应该是个对象,in_array 在比较的时候可以认为是 == 比较,所以两个 object 是不会相等的,都是返回的 false
可以考虑取出 $apps 的所有 id 来比较
InternetExplorer
2018-04-02 12:55:20 +08:00
我可能又说错了......
(array)$diffApp) 得到的东西你 dd 出来看一下就知道为什么了。
我补觉去了(~﹃~)~zZ
HYSS
2018-04-02 12:58:09 +08:00
又黑我 PHP
wanghanlin
2018-04-02 13:22:41 +08:00
```
return App::select('apps.*', DB::raw('IF(app_user.id IS NULL, false, true) as is_allow'))
->leftJoin('app_user', function($query){
return $query->on('app_user.app_id', 'apps.id')
->where('user_id', auth()->id())
->orWhereNull('user_id');
})
->get()
```
wanghanlin
2018-04-02 13:28:22 +08:00
格式没了,不过 SQL 能做的还是不用放 php 里面吧。
vincenttone
2018-04-02 14:51:40 +08:00
看起来是 in_array(Array1, Array2)了,估计楼主的 Array2 是个两层的数组,数组没法这样比较。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/443470

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX