如何在PHP上对数组进行排序以强制将所选行作为第一行?
我的数组是
array[]=array(id=>'a', content=>'lemon');
array[]=array(id=>'b', content=>'apple');
array[]=array(id=>'c', content=>'banana');
array[]=array(id=>'d', content=>'cherry');
如何对数组进行排序
array[]=array(id=>'b', content=>'apple');
作为第一行,其余的都无所谓(苹果是关键)。
在另一个示例中,依次排序以获取
array[]=array(id=>'d', content=>'cherry');
作为第一行,其余的都不重要(樱桃是关键)。
答案 0 :(得分:2)
我可以考虑两种方法来做到这一点。首先是因为Ultimater在评论中建议提取匹配的行,然后进行排序,然后将其添加回...
$first = 'apple';
$array = [];
$array[]=array('id'=>'a', 'content'=>'lemon');
$array[]=array('id'=>'b', 'content'=>'apple');
$array[]=array('id'=>'c', 'content'=>'banana');
$array[]=array('id'=>'d', 'content'=>'chery');
$firstElement = array_search($first, array_column($array, "content"));
$row = $array[$firstElement];
unset($array[$firstElement]);
sort($array);
array_unshift($array, $row);
print_r($array);
第二种方法是使用usort
并添加特定的子句,因为如果键首先与您想要的行匹配,那么它将始终将其强制到第一行...
$first = 'apple';
usort($array, function ($a, $b) use ($first){
if ( $a['content'] == $first) {
return -1;
}
if ( $b['content'] == $first) {
return 1;
}
return $a <=> $b;
});
print_r($array);
(我在PHP 7及更高版本中使用过<=>
,如果您需要使用PHP 5,还有其他选择)。
如果您的注释表明不需要对其余数据进行排序,那么第一组代码应减去sort()
。
答案 1 :(得分:2)
执行此操作的另一种方法是使用array_slice
有效地旋转数组,将所需的元素开始:
$first = 'apple';
$k = array_search($first, array_column($array, 'content'));
$array = array_merge(array_slice($array, $k), array_slice($array, 0, $k));
print_r($array);
输出:
Array (
[0] => Array ( [id] => b [content] => apple )
[1] => Array ( [id] => c [content] => banana )
[2] => Array ( [id] => d [content] => cherry )
[3] => Array ( [id] => a [content] => lemon )
)
答案 2 :(得分:1)
另一个选择-如果id:content是一对一的,我们可以按内容对数组进行索引,并使用单个空的“ apple”键(或您要查找的任何内容值)与数组合并。 >
$array = array_merge(['apple' => []], array_column($array, null, 'content'));
如果生成的字符串键不受欢迎,则可以使用array_values
重新索引数组。
如果数组仅包含id和content并且id:content实际上是一对一的,则键值对的“字典”将比像这样的行列表更易于处理,这可能会更好尽可能以这种方式设置阵列。
如果id:content不是一对一的,那么...没关系。 ;-)