mysql PHP:使用选定的起始点和初始化的起始点值重新排序显示顺序

sqyvllje  于 2024-01-05  发布在  Mysql
关注(0)|答案(1)|浏览(169)

刚刚参加了一个总结性的面试,面试官给我分配了一个涉及CRUD操作的任务。该任务特别需要显示按“display_order”列排序的数据。在表列表中,有一个复选框允许用户重新排列顺序。要这样做,必须选中该复选框并指定显示顺序的起始点。例如:
示例:起点:2
原始列表:
| ID|显示顺序|复选框|
| --|--|--|
| 69 | 1 ||
| 71 | 2 ||
| 37 | 3 ||
| 52 | 4 ||
| 59 | 5 ||
| 60 | 6 ||
| 86 | 7 |检查|
| 84 | 8 ||
| 77 | 9 |检查|
| 44 | 10 |检查|
预期结果:
| ID|显示顺序|复选框|
| --|--|--|
| 69 | 1 ||
| 86 | 2 ||
| 77 | 3 ||
| 44 | 4 ||
| 71 | 5 ||
| 37 | 6 ||
| 52 | 7 ||
| 59 | 8 ||
| 60 | 9 ||
| 84 | 10 ||
结果:

  1. [
  2. {
  3. "id": "69",
  4. "sort": 1
  5. },
  6. {
  7. "id": "86",
  8. "sort": "2"
  9. },
  10. {
  11. "id": "77",
  12. "sort": "3"
  13. },
  14. {
  15. "id": "44",
  16. "sort": "4"
  17. },
  18. {
  19. "id": "52",
  20. "sort": 5
  21. },
  22. {
  23. "id": "71",
  24. "sort": 5
  25. },
  26. {
  27. "id": "37",
  28. "sort": 5
  29. },
  30. {
  31. "id": "59",
  32. "sort": "5"
  33. },
  34. {
  35. "id": "60",
  36. "sort": "6"
  37. },
  38. {
  39. "id": "84",
  40. "sort": "8"
  41. }
  42. ]

字符串
另一个例子:起点:8
预期结果:
| ID|显示顺序|复选框|
| --|--|--|
| 69 | 1 ||
| 71 | 2 ||
| 37 | 3 ||
| 52 | 4 ||
| 59 | 5 ||
| 60 | 6 ||
| 84 | 7 ||
| 86 | 8 ||
| 77 | 9 ||
| 44 | 10 ||
结果:

  1. [
  2. {
  3. "id": "69",
  4. "sort": 1
  5. },
  6. {
  7. "id": "71",
  8. "sort": 2
  9. },
  10. {
  11. "id": "37",
  12. "sort": 3
  13. },
  14. {
  15. "id": "52",
  16. "sort": 4
  17. },
  18. {
  19. "id": "59",
  20. "sort": 5
  21. },
  22. {
  23. "id": "60",
  24. "sort": 6
  25. },
  26. {
  27. "id": "86",
  28. "sort": "8"
  29. },
  30. {
  31. "id": "77",
  32. "sort": "9"
  33. },
  34. {
  35. "id": "44",
  36. "sort": "10"
  37. },
  38. {
  39. "id": "84",
  40. "sort": 11
  41. }
  42. ]


下面是我到目前为止的代码:

  1. public function reorder_list($request, $model = 'talk_news') {
  2. $inputted_display_order = 7;
  3. if (isset($request['sortable']) && $request['sortable']) {
  4. $this->setOrm(ORM::for_table($model));
  5. $sorted_ids = array_column($request['sortable'], 'id');
  6. $sorted_display_order = array_column($request['sortable'], 'sort');
  7. $first_display_order = reset($sorted_display_order);
  8. $last_display_order = end($sorted_display_order);
  9. $new_order = [];
  10. $query = $this->_orm->select('id')
  11. ->select('display_order')
  12. ->where_not_in('id', $sorted_ids)
  13. ->order_by_asc('display_order')
  14. ->find_array();
  15. $starting_display_order = $first_display_order == 1 ? count($sorted_display_order) + 1 : 1;
  16. foreach($query as $item) {
  17. $id = $item['id'];
  18. $display_order = $item['display_order'];
  19. $sort_value = $starting_display_order++;
  20. if ($display_order > $last_display_order && $first_display_order != 1) {
  21. $sort_value = $display_order;
  22. }
  23. if($display_order >= min($sorted_display_order) && $display_order <= max($sorted_display_order) && $first_display_order != 1) {
  24. $count_to_max = (max($sorted_display_order) + 1) - $display_order;
  25. $sort_value = $display_order + $count_to_max;
  26. }
  27. $new_order[] = [
  28. 'id' => $id,
  29. 'sort' => $sort_value
  30. ];
  31. }
  32. $new_order = array_merge($new_order, $request['sortable']);
  33. usort($new_order, function ($a, $b) {
  34. return $a['sort'] - $b['sort'];
  35. });
  36. return $new_order;
  37. }
  38. }


为了复制这一点,我将提供来自查询和$request ['sortable']的数据:
$query的示例数据:

  1. [{"id":"69","display_order":"1"},{"id":"71","display_order":"2"},{"id":"37","display_order":"3"},{"id":"52","display_order":"4"},{"id":"59","display_order":"5"},{"id":"60","display_order":"6"},{"id":"84","display_order":"8"},{"id":"74","display_order":"11"},{"id":"64","display_order":"12"},{"id":"25","display_order":"13"},{"id":"70","display_order":"14"},{"id":"73","display_order":"15"},{"id":"68","display_order":"16"},{"id":"38","display_order":"17"},{"id":"26","display_order":"18"},{"id":"5","display_order":"19"},{"id":"33","display_order":"20"},{"id":"41","display_order":"21"},{"id":"40","display_order":"22"},{"id":"55","display_order":"23"},{"id":"57","display_order":"24"},{"id":"61","display_order":"25"},{"id":"65","display_order":"26"},{"id":"66","display_order":"27"},{"id":"67","display_order":"28"},{"id":"46","display_order":"29"},{"id":"76","display_order":"30"},{"id":"78","display_order":"31"},{"id":"79","display_order":"32"},{"id":"81","display_order":"33"}]


$request“sortable”的示例数据]

  1. [{"id":"86","sort":"2"},{"id":"77","sort":"3"},{"id":"44","sort":"4"}]

lymnna71

lymnna711#

你可以重新索引$request['sortable'],这样你就有了一个由sort索引的id s数组。然后,对于每个显示顺序,如果存在,从重新索引的数组中获取id,否则array_shift()$query开始的下一个项目。
类似于:

  1. public function reorder_list($request, $model = 'talk_news') {
  2. if (isset($request['sortable']) && $request['sortable']) {
  3. $this->setOrm(ORM::for_table($model));
  4. $sorted_ids = array_column($request['sortable'], 'id');
  5. /* create array of ids indexed by sort */
  6. $sorted_display_order = array_column($request['sortable'], 'id', 'sort');
  7. $new_order = [];
  8. $query = $this->_orm->select('id')
  9. ->select('display_order')
  10. ->where_not_in('id', $sorted_ids)
  11. ->order_by_asc('display_order')
  12. ->find_array();
  13. $total_count = count($query) + count($sorted_ids);
  14. for ($i = 1; $i <= $total_count; $i++) {
  15. if (array_key_exists($i, $sorted_display_order)) {
  16. $id = $sorted_display_order[$i];
  17. } else {
  18. $id = array_shift($query)['id'];
  19. }
  20. $new_order[] = ['id' => $id, 'sort' => $i];
  21. }
  22. return $new_order;
  23. }
  24. }

字符串

展开查看全部

相关问题