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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1257閲覧

PHP5からPHP7へ移行時のarsortの並び順について

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/03/28 06:34

PHPマニュアルによると、「比較結果が等しくなる二つの要素があった場合、ソートした配列におけるそれらの並び順は不定となる」ということなのですが、PHP5.3.xからPHP7.1.xへの移行時に、同じプログラムでもarsortした値の順番が変わってしまいます。
移行してもPHP5.3.xのままの順番を保持する方法がありましたらご教示いただけますと幸いです。
どうぞよろしくお願いいたします。

<?php function test($aArray,$aLength) { arsort($aArray); foreach ($aArray as $ck => $cv) { $array[] = $ck; } for($cnt=0;$cnt<$aLength;$cnt++) { $result .= $array[$cnt] . '>'; } return $result; } $array = Array(0.5,2.5,0.5,2.5,2.3,2.5); $test = test($array,3); print $test; ?>

PHP5.3.xの$testの表示結果:3>5>1>
PHP7.1.xの$testの表示結果:1>3>5>

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

PHP: 下位互換性のない変更点 - Manual

内部的なソートアルゴリズムが改良されたことに伴って、 比較したときに等しいとみなされる要素の並び順が以前とは変わるかもしれません。

注意:
同値な要素の並び順に依存するコードは書かないようにしましょう。 その並び順がいつまでも同じであるとは限りません。

phpのバージョンに依存しない別の方法を模索するしかないかと存じます。

投稿2018/03/28 06:48

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/28 07:21

書き方を見直そうと思います。 ご回答いただき、どうもありがとうございました。
guest

0

PHPマニュアルを確認しますと、

注意:

比較結果が等しくなる二つの要素があった場合、ソートした配列におけるそれらの並び順は不定となります。

パラメータ

sort_flags
オプションのパラメータ sort_flags によりソートの動作を修正可能です。詳細については、 sort() を参照ください。

とあります。

第2引数のsort_flagsで調整してみては?

投稿2018/03/28 06:49

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/28 06:56

フラグをいじってテストコードを動かしているけど、そういう問題ではない気がします。 同値どうしの比較の場合の順序がphp7移行で保証されている(それ以前は謎アルゴリズム)のであって、値の比較の仕方を与えるフラグの問題ではないのだと。
m.ts10806

2018/03/28 07:04 編集

ご指摘ありがとうございます。 回答を投稿した後にm6uさんの回答を見て、「なるほどなあ」と納得していたところです。勉強になります。 私もバージョンに依存しそうな書き方してしまっているところは見直さないと・・・。
退会済みユーザー

退会済みユーザー

2018/03/28 07:14

SORT_NUMERIC等、試してみたのですが、 残念ながら結果変わらないようです。 ご回答いただきまして、どうもありがとうございました。
m.ts10806

2018/03/28 07:15

すみません。 その辺りは先のお二人の指摘通りです。 m6uさんの仰るとおり、バージョンに依存しないコーディングをご検討ください。
退会済みユーザー

退会済みユーザー

2018/03/28 07:19

すみません、ご返信書き込んだ後に他の方の回答に気付きました。 最初に作った時に設計が甘かったと思いますので、見直そうと思います。 皆様、どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問