2017-05-25 52 views
0

我有一些代码,我已经试过修改,以使阵列按字母顺序排序,我认为以下几点:添加字母排序

public function getOptions(array $aggs, $filterEmptyOptions = true) 

应该是:

public function getOptions(array sort($aggs), $filterEmptyOptions = true) 

但它不不工作,我应该在哪里添加sort()到数组中?

编辑:我想啤酒厂的名字按字母顺序排序

这是我的全部代码,如果它可以更容易?

class BreweryBoolMustFilter implements BoolFilterInterface 
{ 

/** 
* @param Query $query 
* @param Query\BoolQuery $bool 
* @param Request $request 
* @param array $filters 
*/ 
public function __construct(Query $query, Query\BoolQuery $bool, Request $request, array &$filters) 
{ 
    if ($request->query->has('brewery') && (int) $request->query->get('brewery')) 
    { 
     $filters['brewery'] = (int) $request->query->get('brewery'); 

     $bool->addMust(new Query\Term(['breweryId' => $filters['brewery']])); 
    } 

    $aggs3 = new Terms('breweries'); 
    $aggs3->setField('breweryId'); 
    $aggs3->setSize(100); 

    $query->addAggregation($aggs3); 
} 


/** 
* @param array $aggs 
* @param bool $filterEmptyOptions 
* 
* @return array 
*/ 
public function getOptions(array $aggs, $filterEmptyOptions = true) 
{ 
    $breweriesObjects = (new BreweryQuery)->find(); 

    $breweries = []; 

    foreach ($breweriesObjects as $breweryObject) 
    { 
     $breweries[$breweryObject->getId()] = [ 
      'name'  => $breweryObject->getName(), 
      'doc_count' => 0, 
     ]; 
    } 

    foreach ($aggs['breweries']['buckets'] as $bucket) 
    { 
     if (isset($breweries[$bucket['key']])) 
     { 
      $breweries[$bucket['key']]['doc_count'] = $bucket['doc_count']; 
     } 
    } 

    if (true === $filterEmptyOptions) 
    { 
     foreach ($breweries as $key => $brewery) 
     { 
      if (0 == $brewery['doc_count']) 
      { 
       unset($breweries[$key]); 
      } 
     } 
    } 

    return $breweries; 
} 
+0

你不把函数调用一个函数,你把它放在函数体中。 – Barmar

+0

查看大量有关排序数组信息的重复问题。然后用它在每个元素中用'name'值对'$ breweries'进行排序。 – Barmar

+0

@Barmar不是重复的,因为问题的主要问题不仅仅是排序,而且还在另一个参数的内部运行函数,所以我建议您重新考虑 – calexandre

回答

0

你需要调用sort()的功能,而不是在参数列表。填写后应按$breweries排序,并按name值排序。您可以使用usort()

public function getOptions(array $aggs, $filterEmptyOptions = true) 
{ 
    $breweriesObjects = (new BreweryQuery)->find(); 

    $breweries = []; 

    foreach ($breweriesObjects as $breweryObject) 
    { 
     $breweries[$breweryObject->getId()] = [ 
      'name'  => $breweryObject->getName(), 
      'doc_count' => 0, 
     ]; 
    } 

    usort($breweries, function($a, $b) { 
     if ($a['name'] < $b['name']) { 
      return -1; 
     } elseif ($a['name'] > $b['name']) { 
      return 1; 
     } else { 
      return 0; 
     } 
    }); 

    foreach ($aggs['breweries']['buckets'] as $bucket) 
    { 
     if (isset($breweries[$bucket['key']])) 
     { 
      $breweries[$bucket['key']]['doc_count'] = $bucket['doc_count']; 
     } 
    } 

    if (true === $filterEmptyOptions) 
    { 
     foreach ($breweries as $key => $brewery) 
     { 
      if (0 == $brewery['doc_count']) 
      { 
       unset($breweries[$key]); 
      } 
     } 
    } 

    return $breweries; 
} 
+0

谢谢,但那不起作用,sort()需要在foreach()中? –

+0

我不明白为什么你排序'$ aggs'摆在首位。您将返回'$ breweries',其顺序不取决于'$ aggs'中桶的顺序。也许你应该对'$ brieweriesObjects'进行排序?你能否更新问题并显示你想要得到的结果? – Barmar

+0

谢谢我已经更新了这个问题,它是我尝试按字母顺序排序的啤酒厂名称 –

0

PHP只索引自然数据类型,您不能使用参数执行函数。

最好的情况下,你可以做关闭范围把功能或匿名函数里面工作的所有代码,关闭范围:在参数规格

$f = function($data){ 
    return sort($data); 
}; 
yourfunction($f()); 
yourfunction2($f());