我可以在PHP的array_search或sort函数中使用函数吗?

时间:2015-10-25 08:32:13

标签: php arrays sorting parse-platform

我正在使用Parse.com API,但我不会说这是一个Parse问题。

我有一个名为$groups的ParseObjects数组和一个名为$inputs的ParseObjects数组。

我已经拥有这两个,所以我不想做任何新的查询。

所有输入对象都是其中一个组对象的子对象。我想获得属于每个$inputs的所有$group数组。

我能做到的一种方法是:

$groups= // array of ParseObjects
$inputs= // array of ParseObjects

foreach ($groups as $group) 
{
    $inputsInGroup=array();
    foreach ($inputs as $input) 
    {
        if($input->get('parent')==$group)
        {
                array_push($inputsInGroup,$input);
        }
     }
    //here I can use $inputsInGroup which will contain all elements that have this group as their parent
}

这样可行,但接缝效率非常低,因为它必须搜索每个组的整个输入列表,包括它已经确定属于前一组的任何输入。

有没有办法向array_search ()sort()提供一个函数来返回通过此检查的数组中的对象$input->get('parent')==$group

我知道你可以用jQuery sort()做到这一点似乎PHP可能有类似的方法。

2 个答案:

答案 0 :(得分:2)

你有一个不需要的嵌套循环 - 这就是

的原因
$groups; // array of ParseObjects
$inputs; // array of ParseObjects

$ibg; // inputs by group

foreach($inputs as $input) {
    var $group = $input->get('parent')->getObjectId();
    if(!isset($ibg[$group])){
        $ibg[$group] = array();
    }
    $ibg[$group][] = $input;
}

答案 1 :(得分:0)

您要求的是将带有自定义回调的过滤器应用于数组,可以使用array_filter来完成。然而,这种变化本质上只是范式 - 因为渐近复杂性不会有太大变化。

array_filter($groups, function ($group) use ($inputs) {
    foreach($inputs as $input) {
        if ($input->get('parent') == $group) {
            return true;
        }
    }
});

两者在时间复杂度上仍然是O(n * k),但是一种方法使用的是更具功能性的方法,而不是程序方法。