attikottidetti
@attikottidetti

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

PHP 二次元の配列のソート方法を教えてください。

Q&A

Closed

解決したいこと

二次元の配列を考えています。$kigenlist [x][y]
xは通し番号です。
yは、0,1,2としています。

$kigenlist [x][0]は、タイトル
$kigenlist [x][1]は、整理番号
$kigenlist [x][2]は、残日数

です。
この配列を、残日数でソートして表示したいのですが、配列のソート方法がよく分かりません。連想配列についての記事は見つけたのですが、連想配列を普段は使わず、うまく飲み込めません。
よろしくお願いします。

MySQLでの抽出結果をこの配列に入れて、その後に残日数の短い順で表示しようとしています。この配列に入れるとことまでは問題なくできました。
テーブルが複数あるので、最初からMySQLでソートして出力することができず、仮の配列に必要な情報を記憶させてから、最後にソートして表示したいという状況です。

よろしくお願いします。

0

2Answer

uasort()を使うのはどうでしょう?
https://www.php.net/manual/ja/function.uasort.php

例1 基本的な uasort() の例

をアレンジするとこんな感じでしょうか。

<?php
function cmp($a, $b) {
    if ($a[2] == $b[2]) {
        return 0;
    }
    return ($a[2] < $b[2]) ? -1 : 1;
}

$kigenlist = array(
    array('title1', 1, 3),
    array('title2', 2, 5),
    array('title3', 3, 1),
    array('title4', 4, 8),
);
print_r($kigenlist);

uasort($kigenlist, 'cmp');
print_r($kigenlist);
?>
0Like

Comments

  1. @attikottidetti

    Questioner

    ありがとうございます。
    読解力がとぼしいのでしょうか、よく分かりませんでした。

    $kigenlist [0][0]='keiri';
    $kigenlist [0][1]='k0001';
    $kigenlist [0][2]='10';
    $kigenlist [1][0]='keiri';
    $kigenlist [1][1]='k0002';
    $kigenlist [1][2]='11';
    $kigenlist [2][0]='jinji';
    $kigenlist [2][1]='j0001';
    $kigenlist [2][2]='7';
    $kigenlist [3][0]='jinji';
    $kigenlist [3][1]='j0002';
    $kigenlist [3][2]='15';
    $kigenlist [4][0]='soumu';
    $kigenlist [4][1]='s0001';
    $kigenlist [4][2]='2';
    $kigenlist [5][0]='soumu';
    $kigenlist [5][1]='s0001';
    $kigenlist [5][2]='22';
    データは、こんな感じに入っております。
    それで$kigenlist [n][2]の項目でソートしたいと考えております。
    その結果、こうなります。
    $kigenlist [4][0]='soumu';
    $kigenlist [4][1]='s0001';
    $kigenlist [4][2]='2';
    $kigenlist [2][0]='jinji';
    $kigenlist [2][1]='j0001';
    $kigenlist [2][2]='7';
    $kigenlist [0][0]='keiri';
    $kigenlist [0][1]='k0001';
    $kigenlist [0][2]='10';
    $kigenlist [1][0]='keiri';
    $kigenlist [1][1]='k0002';
    $kigenlist [1][2]='11';
    $kigenlist [3][0]='jinji';
    $kigenlist [3][1]='j0002';
    $kigenlist [3][2]='15';
    $kigenlist [5][0]='soumu';
    $kigenlist [5][1]='s0001';
    $kigenlist [5][2]='22';

    この後、
    $i=0;
    while ($i<5){
    print $kigenlist[$i][0].$kigenlist[$i][1].$kigenlist[$i][2].'<br>';
    }
    こうやって表示したいのです。
  2. > $i=0;
    > while ($i<5){
    > print $kigenlist[$i][0].$kigenlist[$i][1].$kigenlist[$i][2].'<br>';
    > }

    これだと、ソートしたにもかかわらず必ず$kigenlist[0]から[5]までを順に表示しています。

    配列内の並び順に表示させるには以下のようにすれば良いと思います。

    foreach($kigenlist as $dep) {
    print $dep[0].$dep[1].$dep[2].'<br>';
    }
  3. @attikottidetti

    Questioner

    そのとおりですね。ありがとうございます。

最初の前提を変えて

$kigenlist [x][0]は、残日数
$kigenlist [x][1]は、整理番号
$kigenlist [x][2]は、タイトル

としたあと、残日数でソートすることにし、バブルソートというものにしました。

$count =$i_kigen;
for ($ii = 0; $ii < $count; $ii++) {
  for ($b = 1; $b < $count; $b++) {
    $a = $b-1; //←左隣の数字を$aとする
    if($kigenlist[$a][0] > $kigenlist[$b][0]) {
      $temp[0] = $kigenlist[$b][0];//$temp = $array[$b];
      $temp[1] = $kigenlist[$b][1];//$temp = $array[$b];
      $temp[2] = $kigenlist[$b][2];//$temp = $array[$b];
      $kigenlist[$b][0]=$kigenlist[$a][0];//$array[$b] = $array[$a];
      $kigenlist[$b][1]=$kigenlist[$a][1];//$array[$b] = $array[$a];
      $kigenlist[$b][2]=$kigenlist[$a][2];//$array[$b] = $array[$a];
      $kigenlist[$a][0]=$temp[0];//$array[$a] = $temp;
      $kigenlist[$a][1]=$temp[1];//$array[$a] = $temp;
      $kigenlist[$a][2]=$temp[2];//$array[$a] = $temp;
      }
    }
  }

$ii=0;
while ($ii<$i_kigen){
  print $kigenlist[$ii][0].':'.$kigenlist[$ii][1].':'.$kigenlist[$ii][2].'<br>';  $ii++;
}

とすることにしました。
回答いただき、ありがとうございました。
アルゴリズムは教えていただいたcmpというものになっているのだと思います。

0Like

Your answer might help someone💌