PHP - 按字母顺序排序并为特定变量赋值


PHP - Sort alphabetically and assign values to specific variables

PHP初学者在这里。寻找更高效的代码。

我有一个名为Brands的模型,我正在尝试在我的视图中按字母顺序提取、排序和显示值。

例如:

以字母 A 开头的品牌名称

  1. 品牌1
  2. 品牌2.....等。

以字母 K 开头的品牌名称

  1. 品牌1
  2. 品牌2.....等。

我可以通过以下代码执行相同的操作:

$brandsTable = TableRegistry::get('Brands');

    $brandA = $brandsTable->find('all')->where([
        'deleted =' => 0
        ])-> andWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 'A%'
        )-> orWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 'a%');
    $brandK = $brandsTable->find('all')->where([
        'deleted =' => 0
        ])-> andWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 'K%'
        )-> orWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 'k%');
    $brandS = $brandsTable->find('all')->where([
        'deleted =' => 0
        ])-> andWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 'S%'
        )-> orWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 's%');
    $brandT = $brandsTable->find('all')->where([
        'deleted =' => 0
        ])-> andWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 'T%'
        )-> orWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 't%');
    $brandN = $brandsTable->find('all')->where([
        'deleted =' => 0
        ])-> andWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 'N%'
        )-> orWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 'n%');
    $brandH = $brandsTable->find('all')->where([
        'deleted =' => 0
        ])-> andWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 'H%'
        )-> orWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 'h%');
    $brandM = $brandsTable->find('all')->where([
        'deleted =' => 0
        ])-> andWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 'M%'
        )-> orWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 'm%');
    $brandY = $brandsTable->find('all')->where([
        'deleted =' => 0
        ])-> andWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 'Y%'
        )-> orWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 'y%');
    $brandR = $brandsTable->find('all')->where([
        'deleted =' => 0
        ])-> andWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 'R%'
        )-> orWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 'r%');
    $brandW = $brandsTable->find('all')->where([
        'deleted =' => 0
        ])-> andWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 'W%'
        )-> orWhere(['brand_name_eng LIKE :key'
        ])->bind(':key', 'w%');
    $this->set('brandsA', $brandA);
    $this->set('brandsK', $brandK);
    $this->set('brandsS', $brandS);
    $this->set('brandsT', $brandT);
    $this->set('brandsN', $brandN);
    $this->set('brandsH', $brandH);
    $this->set('brandsM', $brandM);
    $this->set('brandsY', $brandY);
    $this->set('brandsR', $brandR);
    $this->set('brandsW', $brandW);

我相信这不是多次调用模型/执行查询的最有效方法。尝试寻找有效的解决方案(哈希:提取/排序等)但无法获得适当的输出。感谢您的帮助。谢谢!

注意:已删除标志用于逻辑删除。

更新:在 ThinTank 和 ndm 评论之后很抱歉没有提到这一点,因为它是一个日本网站,我正在寻找区分大小写的品牌名称,从

[ A,E,I,O,U

],[ K ],[ S ],[ T ],[ N ],[ H ],[ M ],[ Y ],[ R ],[ W ]

分别。例 : 我有以下品牌

阿迪达斯、艾里森、爱多克斯、锐步、天梭等。

输出应为:以ア开头的品牌名称:阿迪达斯佳 佳埃多克斯

以 ラ [R] 开头的品牌名称:锐 步

以タ[T]开头的品牌名称:天梭...等等,

这里有一种方法可以分解它:

$listBrandsLetter = array('A', 'K', 'S', 'T', 'N', 'H', 'M', 'Y', 'R', 'W');
$brandsTable = TableRegistry::get('Brands');
foreach($listBrandsLetter as $letter)
{
    $currentBrand = $brandsTable->find('all')->where([
                        'deleted =' => 0
                        ])-> andWhere(['brand_name_eng LIKE :key'
                        ])->bind(':key', $letter.'%'
                        )-> orWhere(['brand_name_eng LIKE :key'
                        ])->bind(':key', strtolower($letter).'%');
    $this->set('brands'.$letter, $currentBrand);
}

如果您的目标是减少由于性能问题而导致的查询数量,请通知它。如果性能没问题,只需分解就足够了