LoginSignup
0
0

More than 3 years have passed since last update.

【PHP】2次元配列をキーを指定して並べ替える関数

Posted at

array_multisortより便利?

array_multisortがあまり理解できていないのが悪いですが、とりあえずユーザ定義関数を作った。

キーを指定して、そのキーの値を基準に並べ替えができるように。

課題は某サイトで与えられたもの。

<?php
    // 自分の得意な言語で
    // Let's チャレンジ!!

    [$x, $y] = explode(" ", trim(fgets(STDIN)) );
    $k = trim(fgets(STDIN));

    $num_data = trim(fgets(STDIN));

    for($i = 0; $i < $num_data; $i++ ) {
        [$xi, $yi, $price] = explode(" ", trim(fgets(STDIN)));
        $datas[$i]['x'] = $xi;
        $datas[$i]['y'] = $yi;
        $datas[$i]['price'] = $price;
        $datas[$i]['distance'] = ( $x - $xi )**2 + ( $y - $yi )**2;
    }

    $sum = 0;
    $sorted = val_sort($datas, 'distance');
    for( $i = 0; $i < $k; $i++ ) {
        $sum += (int)$sorted[$i]['price'];
    }
    $ave = $sum / $k;

    echo $ave .PHP_EOL;

    function val_sort($array, $key) {
    // Loop through and get the values of our specified key
        foreach($array as $k=>$v) {
            $b[] = $v[$key];

        }
        asort($b); // キーと要素を維持しつつ昇順
        foreach($b as $k=>$v) {
            $c[] = $array[$k]; // 展開される順番にキーを取り出して元の配列のキーに指定して代入し直す
        }

        return $c; // 代入し直した配列を返す
    }
?>

勉強になったこと

配列の展開をするときにforeachを使えるのは知っていたけど、キーも一緒に取り出して、そのキーをうまく使うと便利になるものだなということ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0