按特定字符串值排序

4
我有一个产品数组。每个产品都是关联数组,具有id、语言类型和产品类型id。
[1] => ["1", "en", "1"],
[2] => ["3", "fr", "1"],
[3] => ["7", "es", "1"],
[4] => ["2", "en", "2"],
[5] => ["4", "fr", "2"],
[6] => ["6", "es", "2"],
[7] => ["8", "en", "3"],
[8] => ["5", "ru", "3"],

我已经使用usort函数对产品ID数组进行了排序。

usort($data, function ($a, b) {

    return ($a['product_type_id'] - $b['product_type_id']);
});

我希望按产品类型 ID 对所有内容进行排序,之后我还希望所有语言 ID 为 'en' 的项目出现在开头。
[1] => ["1", "en", "1"],
[2] => ["2", "en", "2"],
[3] => ["8", "en", "3"],
[4] => ["3", "fr", "1"],
[5] => ["7", "es", "1"],
[6] => ["4", "fr", "2"],
[7] => ["6", "es", "2"],
[8] => ["5", "ru", "3"],

我曾试图以多种不同的方式使用usort来实现这个目标,但是并没有成功。我甚至编写了一个单独的usort函数,将排序后的数组中只有"en"被置于顶部。在这种排序后,"en"确实位于顶部,但产品类型的顺序完全被破坏了。这是我的第二个usort函数。

usort($dataSortedByProductTypeId, function ($a, $b) {
    if($a['language_id'] == 'en'){
        if($b['language_id'] == 'en'){
            return 0;
        } else {
            return -1;
        }
    } else {
        return 1;
    }
});

请帮忙

2个回答

3
如何使用以下内容:

像这样的东西:

$array = [
    ['id' => '1', 'lang' => 'en', 'pid' => '1'],
    ['id' => '3', 'lang' => 'fr', 'pid' => '1'],
    ['id' => '7', 'lang' => 'es', 'pid' => '1'],
    ['id' => '2', 'lang' => 'en', 'pid' => '2'],
    ['id' => '4', 'lang' => 'fr', 'pid' => '2'],
    ['id' => '6', 'lang' => 'es', 'pid' => '2'],
    ['id' => '8', 'lang' => 'en', 'pid' => '3'],
    ['id' => '6', 'lang' => 'ru', 'pid' => '3']
];

usort($array, function ($a, $b) {
    if ($a['lang'] == $b['lang']) {
        return ($a['pid'] - $b['pid']);
    }

    if ($a['lang'] == 'en') {
        return -1;
    } elseif ($b['lang'] == 'en') {
        return 1;
    } else {
        return ($a['pid'] - $b['pid']);
    }
});

这个实际上是有效的,但你能不能解释一下它是如何工作的? - user3410843
1
你正在尝试通过两个不同的值进行排序,首先是 lang,然后是pid,因此我的所有条件语句基本上都在说en排在第一位,但如果发生其它情况,则返回 ($a['pid'] - $b['pid']) - user372495

0

array_multisort会为您完成这项工作。

<?php
$ar = [
1 => ["1", "en", "1"],
2 => ["3", "fr", "1"],
3 => ["7", "es", "1"],
4 => ["2", "en", "2"],
5 => ["4", "fr", "2"],
6 => ["6", "es", "2"],
7 => ["8", "en", "3"],
8 => ["5", "ru", "3"]
];

define('ID',0);
define('LANGUAGE',1);
define('PRODUCT_ID',2);

foreach ($ar as $key => $row) {
        $language[$key] = $row[LANGUAGE];
        $productId[$key] = $row[PRODUCT_ID];
}
var_dump($ar);
array_multisort($productId, SORT_NUMERIC, SORT_ASC,$language, SORT_ASC, SORT_STRING, $ar);
var_dump($ar);

参考: http://php.net/manual/zh/function.array-multisort.php


这并没有做到被要求的事情。 - rjdown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接