PHP数组排序强制第一行

时间:2019-05-26 06:48:12

标签: php arrays

如何在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');

作为第一行,其余的都不重要(樱桃是关键)。

3 个答案:

答案 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 ) 
)

Demo on 3v4l.org

答案 2 :(得分:1)

另一个选择-如果id:content是一对一的,我们可以按内容对数组进行索引,并使用单个空的“ apple”键(或您要查找的任何内容值)与数组合并。 >

$array = array_merge(['apple' => []], array_column($array, null, 'content'));

如果生成的字符串键不受欢迎,则可以使用array_values重新索引数组。

如果数组仅包含id和content并且id:content实际上是一对一的,则键值对的“字典”将比像这样的行列表更易于处理,这可能会更好尽可能以这种方式设置阵列。

如果id:content不是一对一的,那么...没关系。 ;-)