我正在考虑一种与可能非常大的数组集合一起工作的方法。我正在使用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;
}