1

私はプログラミングにまったく慣れていないので、かなり単純に見えるものを完成させようとしましたが、時間がかかりすぎて、どこかに近づいているとは感じていません...

次のような配列をフォーマットしようとしています。

Array (
    [1] = "index.php"
    [2] = "page.php"
    [3] = "sub/subpage.php"
    [4] = "sub/subpage2.php"
    [5] = "sub/subsub/subsubpage.php"
    [6] = "sub/subsub/subsubpage2.php"
    [7] = "sub2/sub2page.php"
)

次のような配列に変換します。

Array (
    [/] => Array (
              [0] => "index.php"
              [1] => "page.php"
          )
    [/sub] => Array (
              [0] => "subpage.php"
              [1] => "subpage2.php"
              [/subsub] => Array (
                  [0] => "subsubpage.php"
                  [1] => "subsubpage2.php"
              )
          )
    [/sub2] => Array (
              [0] => "sub2page.php"
          )
)

この例が私がやろうとしていることを示していることを願っています...これは基本的に、元の(単純な)配列を、HTMLで何らかのナビゲーションを作成するために使用できる配列に再フォーマットしています(ネストされたulを使用)

前もって感謝します!

編集:

多次元配列を作成するためにこれを試しました...

 $parts = explode('/', trim($page["parent"], "/"));
 while ( !empty($parts) ) {
     $pageList[array_pop($parts)] = $page["filename"];
 }

 // $page = array("filename" => "example.php", "parent" => "sub/sub/")
4

3 に答える 3

1

あなたはこのようなことを意味します - それはただの単純なパーサーです

$test = array(
    "index.php",
    "page.php",
    "sub/subpage.php",
    "sub/subpage2.php",
    "sub/subsub/subsubpage.php",
    "sub/subsub/subsubpage2.php",
    "sub2/sub2page.php"
);


function buildPathArray($array)
{
    $t = array();

    foreach ($array as $file) {
        $path = "/";
        $name = $file;

        if (preg_match('~^(.*)/([^/]+)$~', $file, $m)) {
            $path = $m[1];
            $name = $m[2];
        }

        $p = &arrayPath($t, $path);

        $p[] = $name;
    }

    return $t;
}

function &arrayPath(&$array, $path = false)
{
    if ($path == false) {
        return $array;
    }
    else
    {
        if (strpos($path, '/') === false) {
            if (!isset($array[$path])) {
                $array[$path] = array();
            }

            return $array[$path];
        }
        else
        {
            preg_match('~([^/]*)/(.*)~', $path, $m);
            if (!isset($array[$m[1]])) {
                $array[$m[1]] = array();
            }

            return arrayPath($array[$m[1]], $m[2]);
        }
    }
}
于 2013-02-11T20:11:42.347 に答える
1

これを達成する方法の例を用意しました。配列$from

$from = array (
    "index.php",
    "page.php",
    "sub/subpage2.php",
    "sub/subsub/subpage2.php",
    "sub2/sub2page.php",
);

に変換され$toます:

$to = array();
foreach($from as $element) {
    $path = explode('/', $element);
    if(count($path) === 1) {
        array_unshift($path, '/');
    }
    $_to = &$to;
    for($i=0; $i<count($path) -1; $i++) {
        if(!array_key_exists($path[$i], $_to)) {
            $_to[$path[$i]]= array();
        }
        $_to = &$_to[$path[$i]];
    }
    $_to []= $path[count($path) -1];
}
var_dump($to);

.. 次の配列が得られます。

array(3) {
  '/' =>
  array(2) {
    [0] =>
    string(9) "index.php"
    [1] =>
    string(8) "page.php"
  }
  'sub' =>
  array(2) {
    [0] =>
    string(11) "subpage.php"
    'subsub' =>
    array(1) {
      [0] =>
      string(12) "subpage2.php"
    }
  }
  'sub2' =>
  array(1) {
    [0] =>
    string(12) "sub2page.php"
  }
}
于 2013-02-11T20:12:13.763 に答える
0

そのような配列を使用する場合は、キー値も引用符で囲む必要があります。考慮してください:

$array = array(
    '/' => array('index.php', 'page.php'),
    '/sub' => array('blah', 'blah', 'blah'),
    '/sub2' => array('foo', 'bar', 'foobar')
);

arrayキーワードを使用してキー値を正しく設定する方法は、ブラケット表記なしです。これは正しくありません

$array = array(
    [key] => 'value'
);

ただし、配列に何かを追加したい場合は...

$array = array();
$array['foo'] = 'bar'; // named key value
$array[] = 'blah'; // automatic numeric key value
$array[] = array('foo', 'bar'); // md array (array inside an array)

うまくいけば、これはあなたを助けます!

于 2013-02-11T20:01:34.933 に答える