2017-05-25 31 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());