PHP将来自数组上的foreach的某些结果分组为另一个数组

时间:2018-09-27 18:34:39

标签: php arrays foreach

我有一个看起来像这样的数组:

$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 :(得分:1)

您可以将array_filterstrpos结合使用:

$result = array_filter($array, function($filename) { 
  return strpos($filename, 'FILE-F01-E1') === 0; 
});

答案 1 :(得分:0)

使用strpos()运行简单的foreach,以查找字符串中是否存在字符串。

 $results = array();

 foreach($array as $item){
      if (strpos($item, 'FILE-F01-E1') === 0) {
           array_push($results, $item);
      }
 }

答案 2 :(得分:0)

您确定这将是命名格式吗?这是构建正则表达式或检查是否为以下字符串的子字符串的重要信息。

如果我们可以假设这一点,并且“基本”名称始终位于索引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);

答案 3 :(得分:0)

您可以从数组中获取第一项,并使用explodeimplode从文件名中获取部分,而无需最后一个连字符和其后的内容。

然后使用array_filter并使用substr,将0用作起始位置,并将$fileBeginning的长度用作长度,以检查字符串是否以FILE-F01-E1开头:< / p>

$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
)

Demo