从平面数组创建新的多维数组 - 目录路径 - PHP

时间:2012-05-18 09:21:39

标签: php arrays recursion

希望有人能指出我正确的方向......

我有目录路径和部分文件输出形成一个unix grep。我从这些输出中得到一个平面阵列。现在,我想做一些PHP魔术,将这个平面数组转换为更加层次化的多维数组,以获得更精细的用户输出

当前数组;

array(7) {
  [0]=>
  string(160) "/home/user/data/section1/dir1/20120107/filename.txt:random text after the colon"
  [1]=>
  string(160) "/home/user/data/section1/dir1/20120108/filename.txt: More random text after the colon"
  [2]=>
  string(160) "/home/user/data/section1/dir2/20120107/filename.txt: More random text after the colon"
  [3]=>
  string(160) "/home/user/data/section1/dir2/20120108/filename.txt: More random text after the colon"
  [4]=>
  string(160) "/home/user/data/section1/dir3/20120107/filename.txt: More random text after the colon"
  [5]=>
  string(160) "/home/user/data/section1/dir3/20120106/filename.txt: More random text after the colon"
  [6]=>
  string(160) "/home/user/data/section1/dir3/20120108/filename.txt: More random text after the colon"
}

我真正想要的是什么

array(1) {
    array(3) {
        ["dir"]=>
        string(4) "dir1"
        ["date"]=>
        string(8) "20120107"
        ["text"]=>
        array (2) {
          [0]=>
          string(160) "random text after the colon"
          [1]=>
          string(160) "More random text after the colon"
          }
    }
    array(3) {
        ["dir"]=>
        string(4) "dir1"
        ["date"]=>
        string(8) "20120108"
        ["text"]=>
        array (2) {
          [0]=>
          string(160) "More random text after the colon"
          [1]=>
          string(160) "More random text after the colon"
          }
    }
    array(3) {
        ["dir"]=>
        string(4) "dir2"
        ["date"]=>
        string(8) "20120107"
        ["text"]=>
        array (2) {
          [0]=>
          string(160) "More random text after the colon"
          [1]=>
          string(160) "More random text after the colon"
          }
    }
}

我已经尝试过很多foreach的SPL迭代器方法,但我只是不会出类拔萃。寻找任何指导。

全部谢谢

6 个答案:

答案 0 :(得分:2)

此代码(使用for循环):

<?php
$data[] = "/home/user/data/section1/dir1/20120107/filename.txt:random text after the colon";
$data[] = "/home/user/data/section1/dir1/20120108/filename.txt: More random text after the colon";
$data[] = "/home/user/data/section1/dir2/20120107/filename.txt: More random text after the colon";
$data[] = "/home/user/data/section1/dir2/20120108/filename.txt: More random text after the colon";
$data[] = "/home/user/data/section1/dir3/20120107/filename.txt: More random text after the colon";
$data[] = "/home/user/data/section1/dir3/20120106/filename.txt: More random text after the colon";
$data[] = "/home/user/data/section1/dir3/20120108/filename.txt: More random text after the colon";

for($i = 0; $i < count($data); $i++) {
    $data[$i] = str_replace('/home/user/data/section1/','',$data[$i]);
    $tmp = explode('/', $data[$i]);

    $newData[$i] = array(
        'dir' => $tmp[0],
        'date' => $tmp[1]
    );

    $tmp = explode(':', $tmp[2]);

    $newData[$i]['fileName'] = $tmp[0];
    $newData[$i]['text'] = $tmp[1];
}

print_r($newData);
?>

或者此代码(使用foreach循环):

<?php
$data[] = "/home/user/data/section1/dir1/20120107/filename.txt:random text after the colon";
$data[] = "/home/user/data/section1/dir1/20120108/filename.txt: More random text after the colon";
$data[] = "/home/user/data/section1/dir2/20120107/filename.txt: More random text after the colon";
$data[] = "/home/user/data/section1/dir2/20120108/filename.txt: More random text after the colon";
$data[] = "/home/user/data/section1/dir3/20120107/filename.txt: More random text after the colon";
$data[] = "/home/user/data/section1/dir3/20120106/filename.txt: More random text after the colon";
$data[] = "/home/user/data/section1/dir3/20120108/filename.txt: More random text after the colon";

foreach($data as $d) {
    $tmp = explode('/', str_replace('/home/user/data/section1/','',$d));
    $tmp2 = explode(':', $tmp[2]);

    $newData[] = array(
        'dir' => $tmp[0],
        'date' => $tmp[1],
        'filename' => $tmp2[0],
        'text' => $tmp2[1]
    );
}

print_r($newData);
?>

输出:

Array
(
    [0] => Array
        (
            [dir] => dir1
            [date] => 20120107
            [fileName] => filename.txt
            [text] => random text after the colon
        )

    [1] => Array
        (
            [dir] => dir1
            [date] => 20120108
            [fileName] => filename.txt
            [text] =>  More random text after the colon
        )

============ more data here ============

    [6] => Array
        (
            [dir] => dir3
            [date] => 20120108
            [fileName] => filename.txt
            [text] =>  More random text after the colon
        )

)

答案 1 :(得分:0)

在第一个数组上做一个foreach,在preg_match()中为要从每个字符串中提取的信息元素。

foreach( $firstArray => $strElement )
{
   $newArray[] = array();

   if( preg_match( "~(?<=section1/)[.-\w]*~i", $strElement, $astrMatches) >= 1 )
     $newArray['dir'] = $astrMatches[0];
   ...etc...
}

答案 2 :(得分:0)

Explode每个带有“/”的路径字符串。之后你会得到一个数组。然后在数组中推送所需的元素。

答案 3 :(得分:0)

function magic($array_of_strings)
{
    define('REGEX','_^/home/user/data/section1/(dir\d+)/(\d+)/filename.txt:(.*)$_');
    $ret_array = array();

    foreach($array_of_strings as $string) {
        if (preg_match(REGEX, $string, $matches)) {
            $ret_array []= array(
              'dir'=>$matches[1],
              'date'=>$matches[2],
              'text'=>$matches[3],
            );
        }
    }
    return $ret_array;
}

答案 4 :(得分:0)

好的,这将完成这项工作,您可以根据需要更改目录结构,只要最后两个目录保持相同的顺序/dir/date

您可以在URL后面的多个冒号分隔数组的text部分,添加任意数量的字符串。例如/blah/dir/date/filename.txt : string 1 : string 2

您的原始数组必须被称为$array

享受:

foreach ($array as $string) {
   $temp = array();
   $temp["strings"] = explode(':', $string); //Convert the string into an array using `:` as a seperator
   $temp["path"] = explode('/', $temp["strings"][0]); //Convert the url into an array using `/` as a seperator (each directory is it's own entry)
   $path_count = count($temp["path"]); //Count number of directories in the url
   $output = array(
      "dir" => $temp["path"][$path_count - 3],
      "date" => $temp["path"][$path_count - 2],
      "text" => array()
   );
   foreach ($temp["strings"] as $index => $value) { //Loop through and add any additional text to array
      if ($index) {
         array_push($output["text"], trim($value));
      }      
   }
   print_r($output);
}

答案 5 :(得分:0)

感谢所有输入和脚本。我实际上已经学到了很多关于从这些脚本中将数据压缩到多维数组中的知识。不幸的是,它们都没有完全符合我的要求。我学习研究这个问题的一件事是,“还有另一种方式来呈现数据吗?”在这种情况下,我找到了它。一个shell脚本,用于搜索所有文件,输出文件名,然后输出相关文本。

find /home/user/data/section1 -name 'filename.txt' | xargs grep -il texttxet | 
   while read file 
       do
          echo "$file"
          grep -i  -A 4 texttxet "$file" 
       done

File:/home/user/data/section1/dir1/20120107/filename.txt
line1
line2
line3

File:/home/user/data/section1/dir1/20120108/filename.txt
line1
line2

File:/home/user/data/section1/dir2/20120108/filename.txt
line1
line2

从这一点开始,我可以轻松地在数组中获取此信息。再次感谢所有