0

3つのプロパティを持つオブジェクトがあります。数値1、2、または3(0、1、または2でもかまいません)を入力し、プロパティ値の1つに基づいて番号の昇順でオブジェクトを並べ替えたいと思います。

私のオブジェクトは次のようになります。

var_dump($obj);

array(3) { 
    [0]=> object(stdClass)#25 (92) { 
        ["file_id"]=> string(1) "6" 
        ["name"]=> string(1) "1st item" 
    } 
    [1]=> object(stdClass)#26 (92) { 
        ["file_id"]=> string(1) "7"    
        ["name"]=> "2nd item"
    } 
    [2]=> object(stdClass)#27 (92) { 
        ["file_id"]=> string(1) "8" 
        ["name"]=> "3rd item"
    }
}

1を入力すると、出力は次のようになります。

file_id    name
 6      1st item
 7      2nd item
 8      3rd item

2を入力すると、出力は次のようになります。

7  2nd item
8  3rd item
6  1st item

3を入力すると、出力は次のようになります。

8  3rd item
6  1st item
7  2nd item

この質問は、Stackoverflowで以前に尋ねた質問とほぼ同じですが、唯一の例外は、値自体ではなくsort()、値のインデックス位置を指定する必要があることです。つまり、6,7,8ではなく1,2,3で並べ替える必要があります。file_idfile_id

25あなたがこの質問に特に興奮しているなら(そうです、私はこれがありそうもないことを理解しています)、私は数字が何であるかを知り92、出力で何を表すのか知りたいです:object(stdClass)#25 (92)

4

3 に答える 3

2

私はあなたがusortを探していると思います

3つの比較関数を記述します。属性ごとに、入力値に応じて切り替えます。この比較関数が使用されます。

編集:数字はPHP内部オブジェクトID(#25)とオブジェクトのサイズです。

簡単な例:

function compare_1($a, $b) {
  return strcmp($a->file_id, $b->file_id);
}
// compare_2, compare_3 accordingly as needed with your objects

switch ($input) {
  case 1:
    $compareFunctionName = 'compare_1';
    break;
  case 2:
    $compareFunctionName = 'compare_2';
    break;
  case 3:
    $compareFunctionName = 'compare_3';
    break;
  default:
    throw new Exception('wrong Parameter: input is ' . $input);
 }

 usort($objectArray, $compareFunctionName);

 var_dump($objectArray);
于 2012-08-13T13:12:09.693 に答える
1

いくつかのプロパティで配列を並べ替えた後の質問を理解しているので、たとえば配列(1,2,3,4)が(3,4,1,2)になるように配列を回転させたいと思います。
この例では、配列メンバーとして文字列リテラルを使用しています。オブジェクトへの切り替えは簡単です。

<?php
$sortedData = array('A', 'B', 'C', 'D', 'E'); // getting an array like this has been solved by the answers to your previous question
$foo = rotate($sortedData, 2);
var_dump($foo);


function rotate($source, $n) {
    // could use some pre-checks...
    return array_merge(
        array_slice($source, $n, NULL, true),
        array_slice($source, 0, $n, true)
    );
}

プリント

array(5) {
  [0]=>
  string(1) "C"
  [1]=>
  string(1) "D"
  [2]=>
  string(1) "E"
  [3]=>
  string(1) "A"
  [4]=>
  string(1) "B"
}
于 2012-08-13T13:35:19.237 に答える
0

このタスクを完了するための簡単なアルゴリズムは次のとおりです

ステップ1:入力されたインデックスの値を配列array_search()およびunset関数から削除します

ステップ2:ソート機能を使用して配列をソートします

ステップ3:プッシュ/ポップ機能を使用して、削除された値を配列の先頭に追加します

配列関数の詳細については、 http://www.phpsyntax.blogspot.comをご覧ください。

于 2012-08-13T13:38:34.860 に答える