Массив: как получить положение файла путем естественной сортировки по порядку? - PullRequest
0 голосов
/ 15 марта 2019

Я хочу отсортировать файлы, расположенные в папке, в естественном порядке.Файлы: «1-Test1.docx», «2-Test2.docx», «3-Test3.docx», «10-Test10.docx».

Когда я использую следующее:

for( $i= 0 ; $i <= 4; $i++ ){
    $nomfichier = glob("vendor/templates/part3/*.docx");
    natsort ($nomfichier);
    print_r ($nomfichier);
}

У меня есть:

Array ( [0] => folder1/folder2/1-Test1.docx [2] => folder1/folder2/2-Test2.docx [3] => folder1/folder2/1-Test3.docx [1] => folder1/folder2/10-Test10.docx ) 

Все в порядке.Но когда я пытаюсь повторить каждую позицию, используя один и тот же естественный порядок, это дает мне «10-Test10.docx» сразу после «1-Test1.docx».

    $position = array_search($nomfichier[$i], $nomfichier);
   // echo $nomfichier[$i]. " : ". $position;

дает ...

folder1/folder2/1-Test1.docx : 0 folder1/folder2/10-Test10.docx : 1 folder1/folder2/2-Test2.docx : 2 folder1/folder2/3-Test3.docx : 3 

Принимая во внимание, что я хотел бы получить следующий результат:

folder1/folder2/1-Test1.docx : 0 folder1/folder2/2-Test2.docx : 1 folder1/folder2/3-Test3.docx : 2 folder1/folder2/10-Test10.docx : 3 

Как я могу сделать, чтобы это работало?

Спасибо !!

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Поскольку вы используете цикл for, индекс переопределит сортировку.
Когда вы используете цикл и echo $ arr [1], это все равно элемент 1 в массиве, независимо от того, что показывает сортировка.

Foreach, с другой стороны, не индексируется в цикле и подчиняется порядку сортировки.

// Your array
$arr = array (
  0 => 'folder1/folder2/1-Test1.docx ',
  2 => 'folder1/folder2/2-Test2.docx ',
  3 => 'folder1/folder2/1-Test3.docx ',
  1 => 'folder1/folder2/10-Test10.docx ',
);

foreach($arr as $val){
    echo $val . PHP_EOL;
}

Вывод:

folder1/folder2/1-Test1.docx 
folder1/folder2/2-Test2.docx 
folder1/folder2/1-Test3.docx 
folder1/folder2/10-Test10.docx 

https://3v4l.org/J3SkA

Если по какой-либо причине вам необходимо знать значение ключа индекса, вы можете использовать foreach($arr as $key => $val){, а $ key будет индексом массива.

1 голос
/ 15 марта 2019

Это происходит как natsort сортировка массива, но ключ остается неизменным. поэтому, когда вы печатаете значение 0 index, оно напечатает 10-Test10.docx. Чтобы добиться этого правильно, вы можете использовать array_multisort с флагом SORT_NATURAL, как показано ниже:

for( $i= 0 ; $i <= 4; $i++ ){
    $nomfichier = glob("uploads/*.jpeg");
    array_multisort($nomfichier, SORT_NATURAL);
    $position = array_search($nomfichier[$i], $nomfichier);
    echo $nomfichier[$i]. " : ". $position;
}

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...