こんばんわ。
以下のような手続きで解いてみました。
(A:1 B:2 C:3 D:4 E:5 F:6)
1.Aさんの更新処理
1から2に更新します。
しかし、2は既にBさんが使っています。
そこで、いったんBさんをダミー番号(ここでは7)に
更新し、そのあとAさんを2に更新します。
(A:2 B:7 C:3 D:4 E:5 F:6)
2.Bさんの更新処理
7から3に更新します。
しかし、3は既にCさんが使っています。
そこで、いったんCさんをダミー番号(ここでは1)に
更新し、そのあとBさんを3に更新します。
(A:2 B:3 C:1 D:4 E:5 F:6)
3.Cさんの更新処理
1 => 1 なので更新処理はありません。
(A:2 B:3 C:1 D:4 E:5 F:6)
4.Dさんの更新処理
4から5に更新します。
しかし、5は既にEさんが使っています。
そこで、いったんEさんをダミー番号(ここでは7)に
更新し、そのあとDさんを5に更新します。
(A:2 B:3 C:1 D:5 E:7 F:6)
5.Eさんの更新処理
7から6に更新します。
しかし、6は既にFさんが使っています。
そこで、いったんFさんをダミー番号(ここでは4)に
更新し、そのあとEさんを6に更新します。
(A:2 B:3 C:1 D:5 E:6 F:4)
6.Fさんの更新処理
4から8に更新します。
8は誰も使っていないので、Fさんを8に更新します。
(A:2 B:3 C:1 D:5 E:6 F:8)
終了。
(ダミー番号は、都度使われていないものを使用します)
以上の手続きをコード化したものが以下になります。参考にしてください。
php
1<?php
2//
3// teratail(https://teratail.com/questions/83269)
4// 「変更順の求め方について」より
5//
6error_reporting(E_ALL);
7ini_set('display_errors', '1');
8
9// API
10function post($reserve){
11 print "function post in\n";
12 print_r($reserve);
13 print "function post out\n";
14}
15
16// 予約を変更する処理を行う
17function change_reserves($old_reserves,$new_reserves){
18
19 for($i=0;$i<count($old_reserves);$i++){
20
21 $old_reserve_book = $old_reserves[$i]['book'];
22 $new_reserve_book = $new_reserves[$i]['book'];
23
24 if($old_reserve_book === $new_reserve_book){
25 // 予約の値に変更がないので処理をスキップする
26 continue;
27 }
28
29 $index = -1;
30 for($j=$i+1;$j<count($old_reserves);$j++){
31 // 新しい予約の値が誰かに使われていないか調べる
32 if($old_reserves[$j]['book'] === $new_reserve_book){
33 $index = $j;
34 break;
35 }
36 }
37
38 if($index === -1){
39 // 新しい予約の値が他の誰にも使われていない場合
40 $old_reserves[$i]['book'] = $new_reserve_book;
41 post($old_reserves[$i]);
42 }else{
43 // 新しい予約の値が他人に使われている場合
44
45 // 予約の更新に使うダミー番号を求める
46 // old_reservesを走査し使われていない番号をダミー番号とする
47 $dummy_number = null;
48 for($n=1;$n<=10;$n++){
49 $match = FALSE;
50 for($k=0;$k<count($old_reserves);$k++){
51 if($old_reserves[$k]['book'] === $n){
52 $match = TRUE;
53 break;
54 }
55 }
56 if($match){
57 continue;
58 }else{
59 $dummy_number = $n;
60 break;
61 }
62 }
63
64 // 他人の予約の値をダミー番号に設定する
65 $old_reserves[$index]['book'] = $dummy_number;
66 post($old_reserves[$index]);
67 // 自分の予約の値を更新する
68 $old_reserves[$i]['book'] = $new_reserve_book;
69 post($old_reserves[$i]);
70 }
71 }
72
73 print_r($old_reserves);
74
75}
76
77$old_reserves = [
78 ['person'=>'A', 'book'=>1],
79 ['person'=>'B', 'book'=>2],
80 ['person'=>'C', 'book'=>3],
81 ['person'=>'D', 'book'=>4],
82 ['person'=>'E', 'book'=>5],
83 ['person'=>'F', 'book'=>6],
84];
85
86$new_reserves = [
87 ['person'=>'A', 'book'=>2],
88 ['person'=>'B', 'book'=>3],
89 ['person'=>'C', 'book'=>1],
90 ['person'=>'D', 'book'=>5],
91 ['person'=>'E', 'book'=>6],
92 ['person'=>'F', 'book'=>8],
93];
94
95change_reserves($old_reserves,$new_reserves);
96
97?>
98