1

私が取り組んでいるプロジェクトのために、いくつかの配列を一緒にマージしようとして問題が発生しています。望ましい結果に近づいていますが、このサイトを検索しましたが、有効な解決策が見つかりません。

問題があるとは思えませんが、このプロジェクトは IIS でテストされていますが、最終結果は IIS と Apache の両方で動作する必要があります。

だからここに行く... マージしてアルファベット順に並べ替える必要がある4つのディレクトリがあります。

$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成功せず)

sortやなどを使用してみましたが、機能しないか、リストを作成ksortする前に機能する正しい配置がわかりません。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

私はあなたの質問に少し混乱していますが、あなたがやろうとしていることについては、2D配列でテーブルのようなデータ構造を構築するのが最善だと思います。その後、それを繰り返してテーブルとして表示できます. すべてを一度に行うこともできますが、データ取得ロジックと表示生成ロジックを分離するためのコードがより読みやすく、保守しやすくなります。

また、ディレクトリイテレータを使用して、自分の頭の中でこれを非常に複雑にしすぎていると思います。(出力例に基づいて)実際にやろうとしているのは、ディレクトリのリストの最上位に特定のファイルが存在するかどうかを確認することだけです-その場合、ディレクトリのリストを繰り返してから、探しているファイルのリスト。

また、使用している配列を変更していないため、ここでは 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 に答える