Php 按特定字符串值排序
我有一系列的产品。每个产品都是关联数组,具有id、语言类型和产品类型idPhp 按特定字符串值排序,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", "
[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'])
。