0

まず、タイトルがわかりにくかったらすいません。

基本的に、uasort を使用するスクリプトを通過する 2 つの配列を含む配列があります。この特定の配列では、必要な動作がなかったため、「バグ」を再現するできるだけ単純なコードを使用してみました。

<?php 
$myArray = array(
                 0 => array(
                      0 =>  array(  'field1' => "2.1",
                                    'filed2' => 1815199),
                      1 =>  "database.table",
                      2 =>  array(),
                      3 =>  NULL
                ),
                1 => array(
                      0 =>  array(  'field1' => "3.7",
                                    'filed2' => 1815199),
                      1 =>  "database.table",
                      2 =>  array(),
                      3 =>  NULL
                )
);

echo '@@~~}}~~@@  ';
var_dump( $myArray);

uasort( $myArray, "order_del_upd_ins" );

echo '@@~~{{~~@@  ';
var_dump( $myArray);

function order_del_upd_ins( $a, $b )
{
    echo '~~@@~~@@##@@~~@@~~ ';
    var_dump( $a);
    var_dump( $b);


   return 0;
}?>

したがって、基本的に、最初の配列には値 2.1 が含まれ、2 番目の配列には 3.7 が含まれます。

しかし、それらを印刷すると、uasort (何もしない場所) を通過した後、2 番目の配列が最初に取得され、最初の 2 番目の配列が取得されます。

@@~~}}~~@@  
array(2) {
[0] => array(4) {
      [0] =>
         array(2) {
           'field1' => string(3) "2.1"
           'filed2' => int(1815199)
        }
      [1] => string(14) "database.table"
      [2] => array(0) {}
      [3] => NULL
    }
[1] => array(4) {
     [0] => array(2) {
              'field1' => string(3) "3.7"
              'filed2' => int(1815199)
            }
     [1] => string(14) "database.table"
     [2] => array(0) {}
     [3] => NULL
    }
}

~~@@~~@@##@@~~@@~~ 
array(4) {
[0] =>
    array(2) {
       'field1' => string(3) "3.7"
       'filed2' => int(1815199)
    }
[1] => string(14) "database.table"
[2] => array(0) {}
[3] => NULL
}

array(4) {
[0] => array(2) {
    'field1' => string(3) "2.1"
    'filed2' => int(1815199)
    }
[1] => string(14) "database.table"
[2] => array(0) {}
[3] => NULL
}

@@~~{{~~@@  
array(2) {
[1] => array(4) {
       [0] =>
          array(2) {
            'field1' => string(3) "3.7"
            'filed2' => int(1815199)
         }
       [1] => string(14) "database.table"
       [2] => array(0) {}
       [3] => NULL
   }
[0] => array(4) {
       [0] =>
          array(2) {
            'field1' => string(3) "2.1"
            'filed2' => int(1815199)
          }
       [1] => string(14) "database.table"
       [2] => array(0) {}
       [3] => NULL
   }
}

基本的に、私は2つの要素の配列を持っていて、何もしない関数uasortに行きますが、それが入るとすぐに、要素は適切に順序付けられなくなります。

PHPマニュアルによると:

uasort — ユーザー定義の比較関数を使用して配列をソートし、インデックスの関連付けを維持する

したがって、私が理解していることから、「ユーザー定義」関数で何も指定しない場合、配列で何も変更されないはずですよね??

誰が何が起こっているのか考えていますか?

どうもありがとう

4

1 に答える 1

0

ユーザー定義の並べ替え関数の戻り値によって、配列の並べ替え方法が決まります。たとえば、次の例は昇順で並べ替えます...

function order_del_upd_ins( $a, $b )
{
   return $a > $b;
}

「ソート関数で何も指定しない場合」とあなたは言いますが、$a と $b が等しいことを意味する 0 を指定します。

こちらの説明をご覧ください.. http://www.php.net/manual/en/function.usort.php

于 2013-03-12T18:22:05.880 に答える