1

我在尝试将几个数组合并在一起以用于我正在处理的项目时遇到问题。我越来越接近预期的结果,我已经搜索了这个网站,但找不到可行的解决方案。

我怀疑这很重要,但是这个项目正在 IIS 上进行测试,但最终结果必须在 IIS 和 Apache 上都可以工作。

所以这里......我有四个目录,我需要按字母顺序合并和排序。

$dir1 = "D:\\dir1";
$dir2 = "D:\\dir2";
$dir3 = "D:\\dir3";
$dir4 = "D:\\dir4";
$dirA = array($dir1,$dir2,$dir3,$dir4);

如果我执行以下操作,我将“接近”我需要的结果:

try
{
  $object = new ArrayIterator($dirA);
  foreach($object as $key=>$value)
  {
    foreach(new DirectoryIterator($value) as $item)
    {
      if(!$item->isDot())
      {
        echo $item->getFilename() .' ';
        if(file_exists($value.'\\'.$item.'\folder.jpg'))
        {
          echo 'Y<br />';
        } else {
          echo 'X<br />';
        }
      }
    }
  }
}
catch(Exception $e)
{
  echo $e->getMessage();
}

并最终得到每个目录中的文件夹列表(按字母顺序),但它们不合并,而是仍然按它们分组$item->key()(我想这是我实际上想要合并的内容?我尝试了多种使用方法array_merge没有成功)

我试过使用sortandksort等,但要么它们不起作用,要么我无法在我echo列出之前弄清楚它的正确放置位置。

我的最终目标是将echo整个事情放到一个表中,我使用多个file_exists来检查每个文件夹中“应该”可用的特定文件......例如,每个文件夹的根目录中都应该有一个“folder.jpg” ,所以我希望它显示如下内容:

Folder Name            folder.jpg      (other files to be verify)
Directory1                 Y            Y   Y   Y   Y   Y
Directory2                 Y            Y   X   Y   Y   Y
Directory3                 X            X   Y   X   X   X
Directory4                 Y            Y   Y   Y   Y   Y

--
希望以上内容不会造成混淆并提供足够的信息,我要感谢任何能够提供帮助的人,并邀请任何愿意帮助该项目的人与我联系(我显然会感谢人在相应的区域)。

再次感谢。

-
编辑:试图澄清一点。

最后,该项目会将某些变量写入“settings.ini”并读取它们(我的那部分工作正常,所以我现在完全忽略了这一点,并将所有内容都写入本地文件中)。

就我而言,我在不同的驱动器上有 4 个文件夹,每个文件夹有 15 到 130 个子目录(所有名称都是唯一的)。所以一个简短的列表看起来类似于:

T:\New Set\
     A\
     D\
     G\
D:\Old Set\
     B\
     F\
  etc.

---------
$dir1 = 'T:/New Set';
$dir2 = 'D:/Old Set';
$dir3 = 'D:/Overage';
$dir4 = 'G:/Unsorted';
$dirA = array($dir1,$dir2,$dir3,$dir4);

使用我最初在上面发布的代码会给我下面的东西(而不是按字母顺序)

A  // from $dir1
D  // from $dir1
G  // from $dir1
B  // from $dir2
F  // from $dir2
etc.

使用 DaveRandom 发布的代码,它显示以下内容:

Array ( [T:\New Set] => Array ( [folder.jpg] => 1 [cover.jpg] => [poster.jpg] => ) [D:\Old Set] => Array ( [folder.jpg] => 1 [cover.jpg] => [poster.jpg] => ) [D:\Overage] => Array ( [folder.jpg] => 1 [cover.jpg] => [poster.jpg] => ) [G:\Unsorted] => Array ( [folder.jpg] => 1 [cover.jpg] => [poster.jpg] => ) )
Folder Name folder.jpg  cover.jpg   poster.jpg
T:\New Set  Y   X   X
D:\Old Set  Y   X   X
D:\Overage  Y   X   X
G:\Unsorted Y   X   X

我想现在,我唯一的问题是仅对子目录进行排序,因为我能够验证文件并以其他方式处理表格。所以为了清楚起见,我希望目录数组不像上面那样显示,而是像下面这样:

A  // from $dir1
B  // from $dir2
D  // from $dir1
F  // from $dir2
G  // from $dir1
etc.
4

1 回答 1

1

我对你的问题有点困惑,但我认为对于你想要做的事情,你最好在二维数组中构建一个类似表格的数据结构,然后你可以对其进行迭代以显示为表格. 您可以一次性完成所有操作,但它会使您的代码更具可读性/可维护性,以分离数据采集和显示生成逻辑。

我还认为您在自己的头脑中使用目录迭代器将其过度复杂化。您真正想做的(根据您的示例输出)是检查目录列表顶层是否存在某些文件 - 在这种情况下,您需要做的就是迭代目录列表,然后迭代您正在查找的文件列表。

我也真的没有看到 ArrayObject/ArrayIterator 在这里的意义,因为你没有修改你正在使用的数组。您可以只循环数组本身。

像这样:

编辑以反映评论。您在这里需要的排序魔法来自array_multisort().

// Don't forget to escape \ backslashes!
// Also, / works on Windows too...
$dirA = array(
  "D:\\dir1",
  "D:\\dir2",
  "D:\\dir3",
  "D:\\dir4"
);

// The list of files you are checking for
$files = array(
  'folder.jpg',
  'cover.jpg',
  'poster.jpg'
);

// The "columns" we want to sort by (highest priority first)
// This is equivalent to SQL: ORDER BY name ASC, path ASC
$sortCols = array(
  'name' => SORT_ASC,
  'path' => SORT_ASC
);

// This will be our results "table"
$results = array();

// This will hold the sort column items
$sortInfo = array();
foreach ($sortCols as $colName => $flags) {
  $sortInfo[$colName] = array();
}

// Loop parent directories
foreach ($dirA as $dir) {

  // Make a DirectoryIterator and loop it
  foreach (new DirectoryIterator($dir) as $child) {

    // Skip files and parent dir
    if (!$child->isDir() || $child->isDot()) {
      continue;
    }

    // Temp array to hold data about this sub-dir
    $result = array();
    $result['path'] = $child->getPathname();
    $result['name'] = basename($result['path']);

    // Now check for the existence of files in the file list
    // You might want to use is_file() instead of file_exists() since
    // it is possible for there to be a directory named 'folder.jpg'
    foreach ($files as $file) {
      $result[$file] = file_exists($result['path'].'\\'.$file);
    }

    // Create a "row" for this sub-directory
    $results[] = $result;

    // Create sort data for this directory
    foreach ($sortCols as $colName => $flags) {
      $sortInfo[$colName][] = $result[$colName];
    }

  } // foreach DirectoryIterator

} // foreach $dirA

// Now we have an array of "rows" corresponding to each sub-directory
// we can do some sorting magic with it.
// First we prepare the data to pass to array_multisort() as an array
// of arguments, which we can use with call_user_func_array(). This
// approach allows a dynamic number of sort columns.
$sortData = array();
foreach ($sortCols as $colName => $flags) {
  $sortData[] = $sortInfo[$colName];
  $sortData[] = $flags;
}
$sortData[] = &$results; // Last arg is passed by reference!
// Now we call it
call_user_func_array('array_multisort', $sortData);


// Now we output a table
echo "<table>\n";

// Header row
echo "<tr><th>Folder Name</th><th>Full Path</th>";
foreach ($files as $file) {
  echo "<th>$file</th>";
}
echo "</tr>\n";

// Data rows
foreach ($results as $row) {
  echo "<tr><td>{$row['name']}</td><td>{$row['path']}</td>";
  foreach ($files as $file) {
    echo $row[$file] ? "<td>Y</td>" : "<td>X</td>";
  }
  echo "</tr>\n";
}

echo "</table>";
于 2012-06-18T23:24:59.767 回答