按特定字符串值

时间:2016-03-14 00:44:13

标签: php arrays sorting

我有一系列产品。每个产品都是关联数组,具有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,它接受排序的数组,只使“en”到顶部。在那之后,“en”排在最前面,但产品类型的顺序被彻底销毁。这是我的第二次尝试

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

请帮忙

2 个答案:

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

答案 1 :(得分: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/en/function.array-multisort.php