web-dev-qa-db-ja.com

usort():ユーザー比較関数によって配列が変更されました

Linuxサーバーで正常に動作するWebアプリケーションがありますが、Zend Community Editionサーバーを搭載したMac OSでPHP 5.3を使用して実行すると、エラーが発生します。

usort():ユーザー比較関数によって配列が変更されました

ページが初めて読み込まれるたび(ページがティックオーバーして読み込まれるまで約2分かかります。Linuxサーバーでは、ページは1秒で読み込まれます)。

他の誰かがこれを経験したり、問題を解決する方法を知っている場合、PHPとApacheのメモリ設定を試してみたが、運が悪かった。

46
Michael

PHPバグがあり、配列を変更しなくても、この警告が発生する可能性があります。

短いバージョン、PHP=デバッグ関数がソート配列を検査する場合、それらは参照カウントを変更し、usort()をトリックして、データを変更したと考えます。

したがって、ソート関数(またはそこから呼び出されるコード)で次のいずれかを実行すると、警告が表示されます。

  • 並べ替えデータのいずれかで_var_dump_または_print_r_を呼び出す
  • debug_backtrace()を呼び出す
  • 例外をスローする-任意の例外-または単に例外を作成する

バグはすべてのPHP 5バージョン> = 5.2.11に影響しますが、PHP> = 7.には影響しません。 バグレポート を参照してください)詳細については。

私の知る限り、唯一の回避策は「それを行わない」(これは例外としては難しい)、またはエラー抑制演算子@usort()を使用してすべてのエラーを無視することです。

85
Achronos

この問題を解決するには、次のように処理します

1) error_reporting を使用します

_$a = array('id' => 2,'val' => 3, 'ind' => 3);
$errorReporting = error_reporting(0);
usort($a);
error_reporting($errorReporting);
_

2)@usort($a);を使用します

_$a = array('id' => 2,'val' => 3, 'ind' => 3);
@usort($a);
_
8
panditharshad

PHPがコールバック関数内でエラーをスローしていたときにこの問題が発生しました。そのため、発生している実際のエラーを吐き出すのではなく、PHPがスローします。

usort():ユーザー比較関数によって配列が変更されました

3
chriswoodford

PHPのバージョンはLinuxボックスにありますか?

Error_reportingレベルは両方のボックスで同じですか?両方をE_ALLに設定してみてください。

警告はほぼ間違いなく嘘ではない。これは、usort()に渡す比較関数がソートしようとしている配列を変更するであることを示しています。これにより、usortに長い時間がかかる可能性があります。

私の最初のステップは、比較関数を研究し、それがなぜ起こっているのかを理解することです。 Linuxボックスが5.3より前のバージョンを使用している場合、比較関数で使用される一部の言語関数の動作に多少の違いがある可能性があります。

1
timdev

PHP5.4を使用してerror_log($message, $message_type, $destination, $extra_headers)でロギングすると、このエラーが発生することがわかりました。問題を解決したログエントリを消去すると、ソート後にロギングを無効にして復元すると、ロギングが一時的に停止する場合があります。

1
user3740692