添加字母排序顺序

时间:2017-05-25 10:32:07

标签: php symfony

我有一些我尝试修改的代码,以便按字母顺序对数组进行排序,我想到了以下内容:

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;
}

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

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

关闭范围的最佳情况是放在函数内部或使用匿名函数来关闭所有代码中的范围:

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