簡體   English   中英

從平面數組創建新的多維數組 - 目錄路徑 - PHP

[英]Create new multidimensional array from flat array - directory paths - PHP

希望有人可以在這里指出我正確的方向......

我有目錄路徑和部分文件輸出形成一個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迭代器方法,但我只是沒有出現王牌。 尋找任何指導。

謝謝大家

這段代碼(使用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
        )

)

在第一個數組上創建一個foreach,在preg_match()中創建要從每個字符串中提取的信息的元素。

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

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

用“/” 分解每個路徑的字符串。之后你會得到一個數組。然后在數組中推送所需的元素。

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;
}

好的,這將完成工作,您可以根據需要更改目錄結構,只要最后兩個目錄保持相同的順序/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);
}

感謝所有輸入和腳本。 我實際上已經學到了很多關於從這些腳本中將數據壓縮到多維數組中的知識。 不幸的是,它們都沒有完全符合我的要求。 我學習研究這個問題的一件事是,“還有另一種方式來呈現數據嗎?” 在這種情況下,我找到了它。 一個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

從這一點來說,我可以輕松地在數組中獲取此信息。 再次感謝所有人

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM