PHP группирует определенные результаты из foreach в массиве в другой массив - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть массив, который выглядит примерно так:

$array =  array( [0] => FILE-F01-E1-S01.pdf 
                 [1] => FILE-F01-E1-S02.pdf 
                 [2] => FILE-F01-E1-S03.pdf 
                 [3] => FILE-F01-E1-S04.pdf 
                 [4] => FILE-F01-E1-S05.pdf 
                 [5] => FILE-F02-E1-S01.pdf 
                 [6] => FILE-F02-E1-S02.pdf 
                 [7] => FILE-F02-E1-S03.pdf );

По сути, мне нужно посмотреть на первый файл, а затем получить все остальные файлы, которые имеют то же начало ('FILE-F01-E1 ', например) и поместить их в массив.На данный момент мне не нужно ничего делать с другими.

Я пытался использовать цикл foreach для нахождения предыдущего значения, чтобы сделать это, но мне не повезло.

Примерно так:

$previousFile = null;

foreach($array as $file)
{

    if(substr_replace($previousFile, "", -8) == substr_replace($file, "", -8)) 
    {
        $secondArray[] = $file;
     }

    $previousFile = $file;
}

Итак, $ secondArray будет выглядеть так:

    Array ( [0] => FILE-F01-E1-S01.pdf [1] => FILE-F01-E1-S02.pdf 
            [2] => FILE-F01-E1-S03.pdf [3] => FILE-F01-E1-S04.pdf 
            [4] => FILE-F01-E1-S05.pdf)

Как мой результат.

Спасибо!

Ответы [ 4 ]

0 голосов
/ 27 сентября 2018

Вы можете получить первый элемент из массива и использовать explode и implode , чтобы получить часть из имени файла без последнего дефиса и содержимого после него.

Затем используйте array_filter и используйте substr , используя 0 в качестве начальной позиции и длину $fileBeginning в качестве длины, чтобы проверить, начинается ли строка с FILE-F01-E1:

$array = [
    'FILE-F01-E1-S01.pdf',
    'FILE-F01-E1-S02.pdf',
    'FILE-F01-E1-S03.pdf',
    'FILE-F01-E1-S04.pdf',
    'FILE-F01-E1-S05.pdf',
    'FILE-F02-E1-S01.pdf',
    'FILE-F02-E1-S02.pdf',
    'FILE-F02-E1-S03.pdf',
    "TESTFILE-F01-E1-S03.pdf"
];
$parts = explode('-', $array[0]);
array_pop($parts);
$fileBeginning =  implode('-', $parts);
$secondArray = array_filter($array, function ($x) use ($fileBeginning) {
    return substr($x, 0, strlen($fileBeginning)) === $fileBeginning;
});
print_r($secondArray);

Результат

Array
(
    [0] => FILE-F01-E1-S01.pdf
    [1] => FILE-F01-E1-S02.pdf
    [2] => FILE-F01-E1-S03.pdf
    [3] => FILE-F01-E1-S04.pdf
    [4] => FILE-F01-E1-S05.pdf
)

Демо

0 голосов
/ 27 сентября 2018

Вы можете использовать array_filter в сочетании с strpos:

$result = array_filter($array, function($filename) { 
  return strpos($filename, 'FILE-F01-E1') === 0; 
});
0 голосов
/ 27 сентября 2018

Вы уверены, что это будет формат имен?Это критически важная информация для того, чтобы создать регулярное выражение или что-то, что нужно проверить, чтобы быть подстрокой следующих строк:

Если мы можем предположить, что это «базовое» имя всегда с индексом 0, тогда вы можете сделатьчто-то вроде.

<?php
    $myArr =  [ 
                'FILE-F01-E1-S01.pdf', 
                'FILE-F01-E1-S02.pdf', 
                'FILE-F01-E1-S03.pdf', 
                'FILE-F01-E1-S04.pdf', 
                'FILE-F01-E1-S05.pdf', 
                'FILE-F02-E1-S01.pdf', 
                'FILE-F02-E1-S02.pdf', 
                'FILE-F02-E1-S03.pdf'
              ];

    $baseName        = '';
    $allSimilarNames = [];

    foreach($myArr as $index => &$name) {
      if($index == 0) {
          $baseName = substr($name, 0, strrpos($name, '-'));
          $allSimilarNames[] = $name;
      }
      else {
          if(strpos($name, $baseName) === 0) {
              $allSimilarNames[] = $name;
          }
      }
    }

    var_dump($allSimilarNames);

Это будет

  • Проверить по индексу один, чтобы получить базовое имя для сравнения с
  • Зациклить все элементы в массиве и сопоставить всеэлементы, независимо от того, где они находятся в массиве, которые похожи в соответствии с вашим соглашением об именах

Так что если у вас в следующий раз будет массив, который будет

$myArr =  [ 
                    'FILE-F02-E1-S01.pdf',
                    'FILE-F01-E1-S01.pdf', 
                    'FILE-F01-E1-S02.pdf', 
                    'FILE-F01-E1-S03.pdf', 
                    'FILE-F01-E1-S04.pdf', 
                    'FILE-F01-E1-S05.pdf', 
                    'FILE-F02-E1-S02.pdf', 
                    'FILE-F02-E1-S03.pdf'
                  ]; 

, это вернетвсе элементы, которые соответствуют FILE-F02-E1*.

Вы также можете сделать небольшую функцию из этого для более легкого использования, и вам не придется полагаться на элемент с индексом 0 , который должен быть "основой""имя.

<?php
function findMatches($baseName, &$names) {
    $matches = [];
    $baseName = substr($baseName, 0, strrpos($baseName, '-'));
    foreach($names as &$name) {
        if(strpos($name, $baseName) === 0) {
          $matches[] = $name;
        }
    }

    return $matches;
}

$myArr =  [ 
            'FILE-F01-E1-S01.pdf', 
            'FILE-F01-E1-S02.pdf', 
            'FILE-F01-E1-S03.pdf', 
            'FILE-F01-E1-S04.pdf', 
            'FILE-F01-E1-S05.pdf', 
            'FILE-F02-E1-S01.pdf', 
            'FILE-F02-E1-S02.pdf', 
            'FILE-F02-E1-S03.pdf'
          ];

$allSimilarNames = findMatches('FILE-F01-E1-S01.pdf', $myArr);

var_dump($allSimilarNames);
0 голосов
/ 27 сентября 2018

Запустите простой foreach с strpos(), который ищет вхождение строки в строку.

 $results = array();

 foreach($array as $item){
      if (strpos($item, 'FILE-F01-E1') === 0) {
           array_push($results, $item);
      }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...