質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.61%

複数の配列のソートをする方法

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 563

score 14

PHPを使用して下記の条件でソートをしたいです。

1.配列$team_listから'rank'で昇順、重複するものは'team_id'で昇順でソート(ソート1)
2.同じキーの配列$tank_list,配列$num_listも(ソート1)と同じ順番にソート(ソート2)

どのような方法がありますでしょうか?

//現在
$team_list = Array(
    0 => Array( 'team_id' => 1, 'team_name' => 'アンコウさんチーム', 'rank'  => 1 ), 
    1 => Array( 'team_id' => 2, 'team_name' => 'カメさんチーム', 'rank'  => 3),
    2 => Array( 'team_id' => 3, 'team_name' => 'アヒルさんチーム', 'rank'  => 2), 
    3 => Array( 'team_id' => 4, 'team_name' => 'カバさんチーム', 'rank'  => 2), 
    4 => Array( 'team_id' => 5, 'team_name' => 'ウサギさんチーム', 'rank'  => 4),
    5 => Array( 'team_id' => 6, 'team_name' => 'カモさんチーム', 'rank'  => 3), 
    6 => Array( 'team_id' => 7, 'team_name' => 'レオポンさんチーム', 'rank'  => 2),
    7 => Array( 'team_id' => 8, 'team_name' => 'アリクイさんチーム', 'rank'  => 4),
    8 => Array( 'team_id' => 9, 'team_name' => 'サメさんチーム', 'rank'  => 4), 
);
$tank_list = Array (
    0 => 'IV号戦車D型',
    1 => 'ヘッツァー',
    2 => '八九式中戦車甲型',
    3 => 'III号突撃砲F型',
    4 => 'M3中戦車リー',
    5 => 'ルノーB1bis',
    6 => 'ポルシェティーガー',
    7 => '三式中戦車',
    8 => 'Mk.IV戦車', 
);
$num_list = Array (
    0 => '5人',
    1 => '3人',
    2 => '4人',
    3 => '4人',
    4 => '6人',
    5 => '3人',
    6 => '4人',
    7 => '3人',
    8 => '5人',
);
//ソート後
$team_list = Array(
    0 => Array( 'team_id' => 1, 'team_name' => 'アンコウさんチーム', 'rank'  => 1 ), 
    2 => Array( 'team_id' => 3, 'team_name' => 'アヒルさんチーム', 'rank'  => 2), 
    3 => Array( 'team_id' => 4, 'team_name' => 'カバさんチーム', 'rank'  => 2), 
    6 => Array( 'team_id' => 7, 'team_name' => 'レオポンさんチーム', 'rank'  => 2),
    1 => Array( 'team_id' => 2, 'team_name' => 'カメさんチーム', 'rank'  => 3),
    5 => Array( 'team_id' => 6, 'team_name' => 'カモさんチーム', 'rank'  => 3), 
    4 => Array( 'team_id' => 5, 'team_name' => 'ウサギさんチーム', 'rank'  => 4),
    7 => Array( 'team_id' => 8, 'team_name' => 'アリクイさんチーム', 'rank'  => 4),
    8 => Array( 'team_id' => 9, 'team_name' => 'サメさんチーム', 'rank'  => 4), 
);
$tank_list = Array (
    0 => 'IV号戦車D型',
    2 => '八九式中戦車甲型',
    3 => 'III号突撃砲F型',
    6 => 'ポルシェティーガー',
    1 => 'ヘッツァー',
    5 => 'ルノーB1bis',
    4 => 'M3中戦車リー',
    7 => '三式中戦車',
    8 => 'Mk.IV戦車', 
);
$num_list = Array (
    0 => '5人',
    2 => '4人',
    3 => '4人',
    6 => '4人',
    1 => '3人',
    5 => '3人',
    4 => '6人',
    7 => '3人',
    8 => '5人',
);
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • papinianus

    2019/01/09 18:17

    「3.配列のキーを再振り分け」←ここって何がしたいのでしょうか?

    キャンセル

  • StraightGrain

    2019/01/09 18:30

    よく考えれば、ソートすることでキーは自動で割り振られますね、、
    混乱させてしまい失礼しました。こちらは削除します。

    キャンセル

回答 3

checkベストアンサー

+1

データが間違ってて手惑いましたが($team_list[3]のデータが現在とソート後で違う)

<?php
//現在
$team_list = Array(
    0 => Array( 'team_id' => 1, 'team_name' => 'アンコウさんチーム', 'rank'  => 1 ), 
    1 => Array( 'team_id' => 2, 'team_name' => 'カメさんチーム', 'rank'  => 3),
    2 => Array( 'team_id' => 3, 'team_name' => 'アヒルさんチーム', 'rank'  => 2), 
    3 => Array( 'team_id' => 4, 'team_name' => 'カバさんチーム', 'rank'  => 2), 
    4 => Array( 'team_id' => 5, 'team_name' => 'ウサギさんチーム', 'rank'  => 4),
    5 => Array( 'team_id' => 6, 'team_name' => 'カモさんチーム', 'rank'  => 3), 
    6 => Array( 'team_id' => 7, 'team_name' => 'レオポンさんチーム', 'rank'  => 2),
    7 => Array( 'team_id' => 8, 'team_name' => 'アリクイさんチーム', 'rank'  => 4),
    8 => Array( 'team_id' => 9, 'team_name' => 'サメさんチーム', 'rank'  => 4), 
);
$tank_list = Array (
    0 => 'IV号戦車D型',
    1 => 'ヘッツァー',
    2 => '八九式中戦車甲型',
    3 => 'III号突撃砲F型',
    4 => 'M3中戦車リー',
    5 => 'ルノーB1bis',
    6 => 'ポルシェティーガー',
    7 => '三式中戦車',
    8 => 'Mk.IV戦車', 
);
$num_list = Array (
    0 => '5人',
    1 => '3人',
    2 => '4人',
    3 => '4人',
    4 => '6人',
    5 => '3人',
    6 => '4人',
    7 => '3人',
    8 => '5人',
);

uasort($team_list, function($a, $b) {
  if($a['rank'] != $b['rank']) {
    return($a['rank'] - $b['rank']);
  }
  return($a['team_id'] - $b['team_id']);
});

$keys = array_keys($team_list);

// 素直に入れ直したほうが早い気もする
uksort($tank_list, function($a, $b) use($keys) {
  return(array_search($a, $keys) - array_search($b, $keys));
});
uksort($num_list, function($a, $b) use($keys) {
  return(array_search($a, $keys) - array_search($b, $keys));
});

var_dump($team_list);
var_dump($tank_list);
var_dump($num_list);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

<?php
$full = [];
$keys = ["team_id" => "team_list", "team_name" => "team_list", "rank" => "team_list", "tank" => "tank_list", "members" => "num_list"];
for($i = 0 ; $i <= 8 ; $i++ ) {
    foreach($keys as $key => $value) {
        $full[$i][$key] = $$value[$i][$key] ?? $$value[$i];
    }
}
var_export($full);
array_multisort(array_column($full, "rank"), SORT_ASC,array_column($full, "team_id"), SORT_ASC,$full);
foreach($full as $row) {
    echo implode(", ", $row).PHP_EOL;
}
var_export($full);
$tank_list = array_column($full, "tank");
$num_list = array_column($full, "members");
var_export($tank_list);
var_export($num_list);

// datas
$team_list = Array(
  0 => Array( 'team_id' => 1, 'team_name' => 'アンコウさんチーム', 'rank'  => 1 ), 
  1 => Array( 'team_id' => 2, 'team_name' => 'カメさんチーム', 'rank'  => 3),
  2 => Array( 'team_id' => 3, 'team_name' => 'アヒルさんチーム', 'rank'  => 2), 
  3 => Array( 'team_id' => 4, 'team_name' => 'カバさんチーム', 'rank'  => 2), 
  4 => Array( 'team_id' => 5, 'team_name' => 'ウサギさんチーム', 'rank'  => 4),
  5 => Array( 'team_id' => 6, 'team_name' => 'カモさんチーム', 'rank'  => 3), 
  6 => Array( 'team_id' => 7, 'team_name' => 'レオポンさんチーム', 'rank'  => 2),
  7 => Array( 'team_id' => 8, 'team_name' => 'アリクイさんチーム', 'rank'  => 4),
  8 => Array( 'team_id' => 9, 'team_name' => 'サメさんチーム', 'rank'  => 4), 
  );
$tank_list = Array (
    0 => 'IV号戦車D型',
    1 => 'ヘッツァー',
    2 => '八九式中戦車甲型',
    3 => 'III号突撃砲F型',
    4 => 'M3中戦車リー',
    5 => 'ルノーB1bis',
    6 => 'ポルシェティーガー',
    7 => '三式中戦車',
    8 => 'Mk.IV戦車', 
);

$num_list = Array (
    0 => '5人',
    1 => '3人',
    2 => '4人',
    3 => '4人',
    4 => '6人',
    5 => '3人',
    6 => '4人',
    7 => '3人',
    8 => '5人',
);

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

よくみるとカバさんやウサギさんチームのrankがおかしい

一度まとめてあとでバラしてはどうでしょう?

$team_list = Array(
  0 => Array( 'team_id' => 1, 'team_name' => 'アンコウさんチーム', 'rank'  => 1 ), 
  1 => Array( 'team_id' => 2, 'team_name' => 'カメさんチーム', 'rank'  => 3),
  2 => Array( 'team_id' => 3, 'team_name' => 'アヒルさんチーム', 'rank'  => 2), 
  3 => Array( 'team_id' => 4, 'team_name' => 'カバさんチーム', 'rank'  => 3), 
  4 => Array( 'team_id' => 5, 'team_name' => 'ウサギさんチーム', 'rank'  => 3),
  5 => Array( 'team_id' => 6, 'team_name' => 'カモさんチーム', 'rank'  => 3), 
  6 => Array( 'team_id' => 7, 'team_name' => 'レオポンさんチーム', 'rank'  => 2),
  7 => Array( 'team_id' => 8, 'team_name' => 'アリクイさんチーム', 'rank'  => 4),
  8 => Array( 'team_id' => 9, 'team_name' => 'サメさんチーム', 'rank'  => 4), 
  );
$tank_list = Array (
    0 => 'IV号戦車D型',
    1 => 'ヘッツァー',
    2 => '八九式中戦車甲型',
    3 => 'III号突撃砲F型',
    4 => 'M3中戦車リー',
    5 => 'ルノーB1bis',
    6 => 'ポルシェティーガー',
    7 => '三式中戦車',
    8 => 'Mk.IV戦車', 
);

$num_list = Array (
    0 => '5人',
    1 => '3人',
    2 => '4人',
    3 => '4人',
    4 => '6人',
    5 => '3人',
    6 => '4人',
    7 => '3人',
    8 => '5人',
);

$all=array_map(function($x,$y,$z){
  return [$x,$y,$z];
},$team_list,$tank_list,$num_list );
usort($all,function($x,$y){
  if($x[0]['rank']===$y[0]['rank']) return $x[0]['team_id']>$y[0]['team_id']?1:-1;
  return $x[0]['rank']>$y[0]['rank']?1:-1;
});
$team_list=array_map(function($x){
  return $x[0];
},$all);
$tank_list=array_map(function($x){
  return $x[1];
},$all);
$num_list=array_map(function($x){
  return $x[2];
},$all);

print_r($team_list);
print_r($tank_list);
print_r($num_list);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る