Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按特定字符串值排序_Php_Arrays_Sorting - Fatal编程技术网

Php 按特定字符串值排序

Php 按特定字符串值排序,php,arrays,sorting,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", "

我有一系列的产品。每个产品都是关联数组,具有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($dataSortedByProductTypeId, function ($a, $b) {
    if($a['language_id'] == 'en'){
        if($b['language_id'] == 'en'){
            return 0;
        } else {
            return -1;
        }
    } else {
        return 1;
    }
});

请帮助

以下内容如何:

$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']);
    }
});

array\u 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);

这不符合要求这实际上是起作用的,但你能解释一下这是如何起作用的。你试图按两个不同的值排序,首先是按
lang
排序,然后是按
pid
,所以我所有的if基本上都是说
en
先进行排序,但如果发生任何其他情况,
返回($a['pid'-$b['pid'])