自定义数组按输入字符串和位置排序

时间:2018-08-17 20:49:19

标签: php sorting ksort

我有一个数组。看起来像:

$arr = [
   '0' => ['id'=>9, 'q'=>'motor', 'pos'=>1],
   '1' => ['id'=>10, 'q'=>'NULL', 'pos'=>0],
   '2' => ['id'=>7, 'q'=>'motor', 'pos'=>2],
   '3' => ['id'=>8, 'q'=>'NULL',  'pos'=>0],
   '4' => ['id'=>11, 'q'=>'motor','pos'=>3],
   '5' => ['id'=>11, 'q'=>'exhaust','pos'=>1]
];

如何对上面的数据进行排序以使其看起来像(如果q ='motor'在搜索字符串中):

 $arr = [
       '0' => ['id'=>9, 'q'=>'motor', 'pos'=>1],
       '2' => ['id'=>7, 'q'=>'motor', 'pos'=>2],
       '4' => ['id'=>11, 'q'=>'motor','pos'=>3],
       '1' => ['id'=>10, 'q'=>'NULL', 'pos'=>0],
       '3' => ['id'=>8, 'q'=>'NULL',  'pos'=>0],
       '5' => ['id'=>11, 'q'=>'exhaust','pos'=>1]
    ];

所以:

function custom_sort($input_query, $arr) {
   foreach($arr as $key=>$row) {
      if (strpos($input_query, $row['q'])) {
          ... How to Sort By Pos?
      }
   }
}

谢谢!

已更新(问题/答案) p.s:我正在尝试使用自定义变量作为输入:$ q

usort($arr, function($a, $b) use ($q) {
        if ($a['q'] == $q) {
            if($b['q'] == $q) {
                return ($a['pos'] > $b['pos']) ? 1 : -1;
            }
            return -1;
        }
        if ($b['q'] == $q) {
            return 1;
        }
        return 0;
    });

该功能停止工作。我该怎么解决?

3 个答案:

答案 0 :(得分:2)

您可以使用usort

usort($arr, function($a, $b) {
    if ($a['q'] == 'motor') {
        if($b['q'] == 'motor') {
            return ($a['pos'] > $b['pos']) ? 1 : -1;
        }
        return -1;
    }
    if ($b['q'] == 'motor') {
        return 1;
    }
    return 0;
});

如果需要其他顺序,只需更改功能即可满足您的需求。

答案 1 :(得分:2)

这里有一个usort可以处理您的要求,并包装在一个可以将数组转换为适当位置的函数中

  1. 带有q键且包含$query的项将放置在数组的前面。

  2. 带有q键且包含$query的项目将按其pos值升序排列。

  3. 所有其他内容都将按照其pos值进行排序。

function custom_sort($query, &$arr) {
    usort($arr, function($a, $b) use ($query) {
        $in_a = strpos($a['q'], $query) !== false;
        $in_b = strpos($b['q'], $query) !== false;

        if ($in_a && !$in_b) {
            return -1;
        }
        if (!$in_a && $in_b) {
            return 1;
        }

        return $a['pos'] - $b['pos'];
    });
}

custom_sort("motor", $arr);

在此repl中的大型数据集上进行测试。

答案 2 :(得分:1)

U排序会在这里帮助您

usort( $arr, function ( $a, $b ) {
    if ( $a['q'] === $b['q'] ) {
        return $a['pos'] < $b['pos'] ? -1 : 1;
    }
    if ( $a['q'] === 'motor' ) {
        return -1;
    }
    if ( $b['q'] === 'motor' ) {
        return 1;
    }
    return 0;
} );