我有一系列产品。每个产品都是关联数组,具有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;
}
});
请帮忙
答案 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);