[英]Create new multidimensional array from flat array - directory paths - PHP
Hope someone can point me in the right direction here... 希望有人可以在这里指出我正确的方向......
I've got directory paths and partial file outputs form a unix grep. 我有目录路径和部分文件输出形成一个unix grep。 I have a flat array from these outputs.
我从这些输出中得到一个平面阵列。 Now I'd like to do a bit of PHP magic to turn this flat array into a more hierarchical multidimensional array for more refined user output
现在,我想做一些PHP魔术,将这个平面数组转换为更加分层的多维数组,以获得更精细的用户输出
Current array; 当前数组;
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"
}
What i would really like 我真的想要什么
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"
}
}
}
I have tried a lot of foreach's, SPL iterator methods, but i'm just not coming out trumps. 我已经尝试过很多foreach的SPL迭代器方法,但我只是没有出现王牌。 Looking for any guidance.
寻找任何指导。
Thanks all 谢谢大家
This code (using a for
loop): 这段代码(使用
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);
?>
Or this code (using a foreach
loop): 或者这个代码(使用
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);
?>
Outputs: 输出:
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
)
)
Make a foreach over the first array and preg_match() the elements for the informations you want to extract from each string. 在第一个数组上创建一个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;
}
Ok this will do the job, you can change the directory structure as much as you like as long as the the last two directories keep the same order /dir/date
. 好的,这将完成工作,您可以根据需要更改目录结构,只要最后两个目录保持相同的顺序
/dir/date
。
You can add as many strings as you like to the text
section of the array by seperating them with multiple colons after the URL. 您可以在URL后面的多个冒号分隔数组的
text
部分,添加任意数量的字符串。 eg /blah/dir/date/filename.txt : string 1 : string 2
. 例如
/blah/dir/date/filename.txt : string 1 : string 2
。
Your original array must be called $array
. 您的原始数组必须被称为
$array
。
Enjoy: 请享用:
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);
}
Thanks all for the input and scripts. 感谢所有输入和脚本。 I have actually learned quite a bit about massaging data into multidimensional arrays from these scripts.
我实际上已经学到了很多关于从这些脚本中将数据压缩到多维数组中的知识。 Unfortunately, none of them worked out exactly as i wanted.
不幸的是,它们都没有完全符合我的要求。 One thing i've learned researching this issue, is, 'is there another way to present the data?'
我学习研究这个问题的一件事是,“还有另一种方式来呈现数据吗?” and in this case i found it.
在这种情况下,我找到了它。 A shell script, to search all files, output the filename, and then the relevant text.
一个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
I can easily get this info in an array from this point. 从这一点来说,我可以轻松地在数组中获取此信息。 Thanks all again
再次感谢所有人
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.