0

これはおそらく単純なものですが、頭を包み込むことはできません...私が調査したすべてのものは、配列の昇順または降順の並べ替えについて言及していました...私は配列['id'、'もの']を持っています。

Foreach ($things as $thing) ループは次の順序でエコーします: 1,2,3,4 (明らか) どうすれば次のように並べ替えることができますか: 2,3,4,1 そして 3,4,1,2 そしておそらく4,1,2,3 ...単純に昇順ですが、毎回異なるIDから開始します...そして、テーブル内の実際のIDは必ずしも1,2,3,4ではなく、5,6になる可能性があります,7,8 (ただし常にグループ内)

これは非常に明白ですか?私はまだPHPスケールの最下層にいます:)

4

4 に答える 4

1

カスタム イテレータを実装できます。何かのようなもの :

class ArrayOffsetIterator implements Iterator {
    private $_array;
    private $_index;
    private $_startIndex;

    public function __construct(array $arr, $startIndex = 0) {
        if ($startIndex < 0) throw new Exception("Start index must be greater than zero");

        $this->_array = (array) $arr;

        if (empty($this->_array)) {
            $this->_index = $this->_startIndex = 0;
        } else {
            $this->_index = $this->_startIndex = $startIndex % count($arr);
        }
    }

    public function current() {
        if (empty($this->_array)) {
            return false;
        } else {
            return $this->_array[$this->key()];
        }
    }

    public function key() {
        if (empty($this->_array)) {
            return false;
        } else {
            return $this->_index % count($this->_array);
        }
    }

    public function next() {
        if (!$this->valid()) throw new Exception("End of iterator");
        $this->_index++;
        return $this->current();
    }

    public function rewind() {
        $this->_index = $this->_startIndex;
    }

    public function valid() {
        $size = count($this->_array);
        if ($size == 0) {
            return false;
        } else {
            $count = ($this->_index % $size) + (((int) ($this->_index / $size)) * $size) - $this->_startIndex;
            return $count < $size;
        }
    }
}

そして、このように使用します:

// some unsorted array
$array = array(
    'Erik',
    'Carl',
    'Alphred',
    'Doris',
    'Bob',
);

// sort it however you like...
sort($array);

// create your iterator (we'll start at index 2 of 0 based index)
$iterator = new ArrayOffsetIterator($array, 2);

// because it's an iterator, we can use it in foreach directly
foreach ($iterator as $key => $item) {
   echo $key . ' => ' . $item . "\n";
}

出力します

2 => Carl
3 => Doris
4 => Erik
0 => Alphred
1 => Bob
于 2013-01-07T00:23:10.763 に答える
0

別の方法は、次のようにarray_mergeandを使用することです。array_slice

$myArray = array(4, 5, 6, 7, 8, 1, 2, 3);

function customSort ($array, $start = 7)
{
    sort($array);
    return array_merge(array_slice($array, $start - 1), array_slice($array, 0, $start - 1));
}

echo '<pre>';
var_dump(customSort($myArray));
于 2013-01-07T00:31:46.310 に答える
0

説明はそれほど明確ではないと思います.ある時点で、それは順列に関するものであるという印象を与えます..とにかく、私がそれを正しく理解していて、あなたの数字が連続していることが本当であれば、これはおそらくいくつかの助けになるでしょう:

function test($min, $max, $start){
    if( $start === $min)
        return range($min,$max);
    return array_merge(range($start,$max), range($min,$start-1));
}

私もblausockeの答えが好きです。

于 2013-01-07T01:28:04.803 に答える
0

皆さんありがとう、皆さんは私にいくつかの良い方向性を示してくれました。私にとって機能し、スケーラブルな非常に単純な解決策を見つけました。私の $firstarray は 1,2,3,4 の昇順でした。

2 番目の配列: array_shift($myarray); を使用しました。配列から最初の値を削除して $first_value として保存するには、array_push($myarray, $first_value); を使用しました。配列の最後に最初の値を挿入します。$myarray now = 2,3,4,1 = $secondarray

$ thirdarray には $secondarray を使用し、2 つ目と同じようにしました。したがって、$ thirdarray = 3,4,1,2

ちょっと大雑把ですが、私の目的には合っていて、わずか6行ほどです! 皆さん、ありがとうございました....

于 2013-01-07T06:17:15.097 に答える