PHP数组排序强制第一行

oprakyz7  于 2022-12-17  发布在  PHP
关注(0)|答案(3)|浏览(144)

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

作为第一行,其余行无关紧要(apple是键)。
在另一个例子中,将sort转换为get

array[]=array(id=>'d', content=>'cherry');

作为第一行,其余行无关紧要(cherry是关键)。

rqqzpn5f

rqqzpn5f1#

另一种方法是使用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

e4yzc0pl

e4yzc0pl2#

有两种方法我可以想到这样做。第一种是作为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()就可以了。

gjmwrych

gjmwrych3#

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

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

如果生成的字符串键不合需要,可以使用array_values重新索引数组。
如果数组只包含id和content,并且id:content实际上是一对一的,那么键-值对的“字典”将比这样的行列表更容易处理,并且如果可能的话,最好以这种方式开始设置数组。
如果id:content不是一对一的,那么......没关系。- )

相关问题