1

自然な降順で返されるコンテンツディレクトリがあります。

とを使用scandir()していますnatsort()が、を追加してarray_reverse()も結果は得られません。

私は、この結果に影響を与えるために、他のものと同様にの組み合わせを使用して研究してきましopendir()readdir()

並べ替える項目は、番号付きの画像ファイルです。それらは次のように返されます:10 9 8 7など1000 999 998 997ですが、0

これが私の現在のコードです:

$dir = 'dead_dir/dead_content/';
$launcher = scandir($dir);
natsort($launcher);
array_reverse($launcher, false);
foreach ($launcher as $value) {
    if (in_array(pathinfo($value, PATHINFO_EXTENSION), array('png'))) {
        echo '<img src="dead_dir/dead_content/'.$value.'" />'
    }
}
4

3 に答える 3

1
 $dir='dead_dir/dead_content/';
 $launcher= scandir($dir);
 natsort($launcher);
 $r_launcher = array_reverse($launcher,true);

 foreach($r_launcher as $value ){
   if(in_array(pathinfo($value, PATHINFO_EXTENSION),array('png'))){
       echo '<img src="dead_dir/dead_content/'.$value.'" />'}}
于 2011-09-11T21:36:16.453 に答える
1

問題は単純です。array_reverse()参照により変更されません。sort()ing関数の動作を混乱させています。代わりに、生成された戻り値を使用するだけです。そうは言っても、もっと良い方法があります。読む...

PHP5.4以降rsort($array, SORT_NATURAL)、配列をDESC順に並べ替え、連続する数値を文字列ではなく数値として扱います。natsort()これは、 ingよりも直接的で簡潔な方法array_reverse()です。

デモ
拡張子付きの.jpgデモ)
数字の前に静的文字列を使用したデモ

glob()ディレクトリのスキャンにを使用することをお勧めします。.pngこのようにして、同じ呼び出しでフィルターを追加できます。

$dir = 'dead_dir/dead_content/';
$filepaths = glob($dir . '*.png');
rsort($filepaths, SORT_NATURAL);
foreach ($filepaths as $filepath) {
    echo '<img src="' . $filepath . '" />';
}

パスを省略してファイル名を返すだけの場合は、現在の作業ディレクトリを変更するだけです。

chdir('dead_dir/dead_content');
$filenames = glob('*.png');
rsort($filenames, SORT_NATURAL);
foreach ($filenames as $filename) {
    echo "<div>.png filename => $filename</div>";
}

これで、ファイル名のより特殊な処理が必要な場合は、カスタムの並べ替え機能が役立つ場合があります。

次のスニペットに示されているように、宇宙船のオペレーターは、ジャグリングのデジタル文字列を整数として自動的に入力し、rsort()上記のソリューションと同じ結果を出します。natsort()宇宙船オペレーターの使用は、 thenを使用するよりもさらに直接的ですarray_reverse()

コード:(デモ

$filenames = ["10", "1", "100", "1000", "20", "200", "2"];
usort($filenames, function($a, $b) {
    return $b <=> $a;
});

var_export($filenames);

出力:

array (
  0 => '1000',
  1 => '200',
  2 => '100',
  3 => '20',
  4 => '10',
  5 => '2',
  6 => '1',
)

ファイル名に数字以外の先頭または末尾の文字が含まれている場合は、必要な操作を実行して、の内部を比較しながら不要な文字を削除できますusort()

カスタムソートが宇宙船オペレーターとどのように機能するかをよく知らない人は...

  • ASCオーダーを達成するには、を書き込み$a <=> $bます。
  • DESCオーダーを達成するには、を書き込み$b <=> $aます。
于 2020-06-08T07:39:31.677 に答える
0

画像名が、、 ...の形式123-image_name.jpgになる場合は、次のようになります。2323-image_name.jpg

/**
 * Compares digits in image names in the format "123-image_name.jpg"
 *
 * @param string $img1 First image name
 * @param string $img2 Second image name
 * @return integer -1 If first image name digit is greater than second one.
 * 0 If image name digits are equal.
 * 1 If first image name digit is smaller than second one.
 */
function compareImageNames($img1, $img2){
    $ptr = '/^(\d+)-/'; // pattern

    // let's get the number out of the image names
    if (preg_match($ptr, $img1, $m1) && preg_match($ptr, $img2, $m2)) {
        $first  = (int) $m1[0]; // first match integer
        $second = (int) $m2[0]; // second match integer

        // equal don't change places
        if($first === $second) return 0;

        // if move first down if it is lower than second
        return ($first < $second) ? 1 : -1;
    } else{
        // image names didn't have a digit in them
        // move them to front
        return 1;
    }
}

// sort array
usort($images, 'compareImageNames');
于 2011-09-11T08:46:53.017 に答える