PHP查找多维数组的索引键以更新数组

9
我正在考虑一种与可能非常大的数组集合一起工作的方法。我正在使用Facebook图形API。

当用户注册我正在构建的服务时,我将他们的Facebook ID存储在我的服务中的一个表中。这样做的目的是允许通过我的服务注册的用户更轻松地找到他们的Facebook好友,并且这些好友也已经通过我的服务注册。

目前我正在尝试的是,将Facebook API返回的/me/friends数据对象传递给我的函数,该函数会构建一个查询从而查找FB数据中找到的ID,这个过程很顺利。在这个过程中,我还在构建一个只包含Facebook ID的数组,以便在in_array场景中使用。由于我的查询仅返回匹配到的Facebook ID,所以整个过程中这个数组不断在累积。

当这些数据正在循环自身以创建查询时,我还会更新每个列表项的对象,使其包含一个额外的键/值对,即"are_friends"=> false。到此为止,它都很流畅且相对较快,我已经获得了查询结果,我正在循环这些结果。

现在我遇到了一个问题,我想避免一个循环内部的循环。这就是in_array()的用途。由于我已经创建了存储的FB ID数组,所以现在我可以遍历我的结果来查看是否有匹配项,在这种情况下,我希望将附加'are_friends'=>false的原始对象中的匹配项更改为"true"而不是false。但是我却想不出一个好方法,而不是在结果数组内部的循环中再次循环原始数组。

因此,我希望有人可以帮助我找到一种解决方案,而不需要使用第二个循环。

到目前为止,开始作为原始数组的数组如下:

Array(
    [data](
            [0] => array(
                         are_fb_friends => false
                         name => user name
                         id => 1000
                        )
            [1] => array(
                         are_fb_friends => false
                         name => user name
                         id => 2000
                        )
            [2] => array(
                         are_fb_friends => false
                         name => user name
                         id => 3000
                        )
            )
    )

按照要求

这是我目前的代码逻辑,我试图在上面描述它...

public function fromFB($arr = array())
{
    $new_arr = array();
    if((is_array($arr))&&(count($arr) > 0))
    {
        $this->db->select()->from(MEMB_BASIC);
        $first_pass = 0;
        for($i=0;$i < count($arr);$i++)
        {
            $arr[$i]['are_fb_friends'] = "false";
            $new_arr[] = $arr[$i]['id'];
            if($first_pass == 0)
            {
                $this->db->where('facebookID', $arr[$i]['id']);
            }
            else
            {
                $this->db->or_where('facebookID', $arr[$i]['id']);
            }
            $first_pass++;
        }
        $this->db->limit(count($arr));
        $query = $this->db->get();
        if($query->num_rows() > 0)
        {
            $result = $query->result();
            foreach($result as $row)
            {
                if(in_array($row->facebookID, $new_arr))
                {
                    array_keys($arr, "blue");
                }
            }
        }
    }
    return $arr;
}

你可以发布你的双重循环当前代码吗?我无法完全理解你需要什么。 - user1236048
我编辑了我的帖子以反映代码。 - chris
1个回答

7
要在数组中搜索一个值并获取其键名,可以使用array_search函数,该函数返回元素的键名。
$found_key = array_search($needle, $array);

对于在PHP中进行多维数组搜索,请参考https://dev59.com/dWsz5IYBdhLWcg3wHUS0#8102246
如果您担心优化问题,我认为您应该尝试使用数据库查询(带有适当的索引)。
顺便问一下,您是否正在使用Facebook查询语言?如果没有,请尝试一下,它很有用。

目前我们没有使用FBQL,我们正在做的需要在设备间访问某个点,根据我的了解,这对我们来说行不通(我可能错了)。但总体而言,就Facebook相关事务而言,Graph API已经为我们提供了大部分通用需求的服务。 - chris
顺便提一下,array_search() 函数会返回它所搜索的数组中的索引还是它找到的搜索结果在数组中的索引?换句话说,如果我在上面的示例中搜索 3000,它会返回 "2" 还是 "id"? - chris
数组搜索我认为可能适用于我以后的一些需求,但是与 sorts 中的另一篇帖子的链接完全解决了问题。我稍微修改了一下,但总体而言它非常符合需求,即使不想额外迭代数据集,我认为这是不可避免的麻烦。 - chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接