我在PHP中有一组关于人的数据,其中每行包含关于该个人的一系列细节。
[0] => name1,email1,year1,"country1a,country1b",date1
[1] => name2,email2,year2,"country2a,country2b,country2c",date2
.... etc
我遇到的问题是我需要用逗号将每一行爆炸成一个多维数组,以便我处理它的方式,并且“国家,国家”部分正在搞乱,因为他们需要被爆炸为1项。每行之间的格式相同,但国家/地区的数量可能会有所不同。
我正在尝试仅使用另一个分隔符|替换“”之间的逗号这样我以后就可以把它们炸掉了。
我已经尝试了几种不同的strnpos和str_replace,从我的搜索中我认为preg_replace将是最好的选择,但我正在用正则表达式语法非常困难。 strnpos和str_replace似乎不是非常有效,因为必须同时跟踪这么多不同的字符串位置 - 这是我最初尝试找到“s”的位置的方式。看起来这应该是一件简单的事情,但事实并非如此。有人可以帮助我吗?
答案 0 :(得分:1)
你所拥有的是一个XY问题。您希望将项目拆分为一行,但为此,您要尝试替换引号中的逗号,以免它们干扰分隔值的逗号。
退后一步,尝试:
preg_match_all('/("[^"]+"|[^,]+),?/',$line,$matches);
$result = $matches[1];
这应该为您提供一个包含项目的数组,这些项目可以用逗号分隔或用引号分隔。最后的,?
只是确保使用逗号并且不匹配。
答案 1 :(得分:0)
试试这个:
foreach($array as &$value)if(strpos($value,',')!==false)$value=explode(',',$value);
我用内存做了这个,它可能不起作用。
答案 2 :(得分:0)
今天在搜索第4天找到答案!它之前的结果从未出现过。
https://answers.yahoo.com/question/index?qid=20110425205225AAVdOh1这个答案在实施时非常有效:
foreach($tblArray as &$str) {
$pattern = '/".+"/i';
preg_match($pattern,$str,$matches);
$orig = $matches[0];
$edited = str_replace(', ','|',$orig);
//also removed the ""s for future processing's sake
$edited = str_replace('"',"",$edited);
$str = str_replace($orig,$edited,$str);
}
这很简单,虽然我之前没有考虑过这样的两步过程。我最终得到了
[0] => name1,email1,year1,country1a|country1b,date1
[1] => name2,email2,year2,country2a|country2b|country2c,date2
答案 3 :(得分:0)