dyluck Posted January 2, 2010 Share Posted January 2, 2010 Hi There. To me, this is a tough one, hopefully someone has done this. I am parsing through text files which have a main delimiter then in certian columns have other types of delimiters. Its a long story foreach (explode("\r\n",$a) as $b) { $j = 1; //str replace lines if(!empty($rule)) { $b = str_replace($rule,$aid,$b); } $b = mysql_real_escape_string(trim($b)); //end replace aid in line $delimiter = "|"; //enter each delimiter seperation as array value $vals = array(); foreach (explode($delimiter,$b) as $key => $value) { $vals[$j] = $value; $j++; } //find specific columns and replace the obsure delimiters with the main one $j = 1; foreach($vals as $redelimit) { if($j = $scat) { $vals[$j] = str_replace(" > ", $delimiter, $redelimit); } if($j = $sscat) { $vals[$j] = str_replace("->", $delimiter, $redelimit); } $j++; } unset($redelimit); //SEE EXAMPLE BELOW $vals array should look like that. //HERE IS WHERE I AM HAVING PROBLEMS. NEED TO REPACK THE ARRAY $j = 1; $h = 1; $newvals = array(); foreach($vals as $key => $redelimit)) { if(substr_count($redelimit,$delimiter) > 0 ) { $vals[$ } $h++; } //Compare applicable column numbers and only pack parsevals with matching column values. $x = 0; $parsevals = array(); foreach($number as $restuff) { $parsvals[$x] = $vals[$restuff]; $x++; } RAW Looks like this: VALUE 1|VALUE 2|VALUE 3|VALUE 4 > VALUE 5 > VALUE 6|VALUE 7|VALUE 8->VALUE 9|VALUE 10 What happens after I seperate by the first delimiter is this: $vals array [1] = VALUE 1 [2] = VALUE 2 [3] = VALUE 3 [4] = VALUE 4 > VALUE 5 > VALUE 6 [5] = VALUE 7 [6] = VALUE 8->VALUE 9 [7] = VALUE 10 I then need to turn this into (in array numerical order like that) as this must match a master template of column positioning. [1] = VALUE 1 [2] = VALUE 2 [3] = VALUE 3 [4] = VALUE 4 [5] = VALUE 5 [6] = VALUE 6 [7] = VALUE 7 [8] = VALUE 8 [9] = VALUE 9 [10] = VALUE 10 Hope someone can help! Quote Link to comment https://forums.phpfreaks.com/topic/186965-rework-an-array/ Share on other sites More sharing options...
mikesta707 Posted January 2, 2010 Share Posted January 2, 2010 can you simply use str_replace() second delimiter and turn it into the first? or are they going to be different/random each time? Quote Link to comment https://forums.phpfreaks.com/topic/186965-rework-an-array/#findComment-987317 Share on other sites More sharing options...
dyluck Posted January 2, 2010 Author Share Posted January 2, 2010 Well right now the current code does do the STR_REPLACE for the other delimiters. Because other values may include the same characters, the STR REPLACE can only happen on pre-specified columns, that is why the code has to seperate by the main delimiter first. (say main delimiter is $delimiter = "|" So here is the steps in this code: $b = 'VALUE 1|VALUE 2|VALUE 3|VALUE 4 > VALUE 5 > VALUE 6|VALUE 7|VALUE 8->VALUE 9|VALUE 10'; $delimiter = "|"; //enter each delimiter seperation as array value $vals = array(); foreach (explode($delimiter,$b) as $key => $value) { $vals[$j] = $value; $j++; } This is what $vals array looks like: [1] = VALUE 1 [2] = VALUE 2 [3] = VALUE 3 [4] = VALUE 4 > VALUE 5 > VALUE 6 [5] = VALUE 7 [6] = VALUE 8->VALUE 9 [7] = VALUE 10 The next code takes the rest of the delimiters (based on $scat and $sscat column numbers); $j = 1; foreach($vals as $redelimit) { if($j = $scat) { $vals[$j] = str_replace(" > ", $delimiter, $redelimit); } if($j = $sscat) { $vals[$j] = str_replace("->", $delimiter, $redelimit); } $j++; } unset($redelimit); Here is the current results of the code after it STR_REPLACE the other delimiters to the main delimiter. [1] = VALUE 1 [2] = VALUE 2 [3] = VALUE 3 [4] = VALUE 4|VALUE 5|VALUE 6 [5] = VALUE 7 [6] = VALUE 8|VALUE 9 [7] = VALUE 10 Now I just need to repack this array in order like this [1] = VALUE 1 [2] = VALUE 2 [3] = VALUE 3 [4] = VALUE 4 [5] = VALUE 5 [6] = VALUE 6 [7] = VALUE 7 [8] = VALUE 8 [9] = VALUE 9 [10] = VALUE 10 Thanks for your help! Quote Link to comment https://forums.phpfreaks.com/topic/186965-rework-an-array/#findComment-987320 Share on other sites More sharing options...
dyluck Posted January 3, 2010 Author Share Posted January 3, 2010 Ok I Made some headway. Setup a test.php to test this out: <? $columns = 'VID|VENDOR|| > TID > SID|ISBN|COLUMN1|LAST|FIRST|SSID->|COLUMN2'; $del = 1; if ($del == 3) { $delimiter = ","; } else { if ($del == 2) { $delimiter = "\t"; } else { $delimiter = "|"; } } $delimet2 = ' > TID > SID'; $delimet3 = ' > TID > SID'; $delimet4 = 'SSID->'; $delim2 = 5; $delim3 = 5; $delim4 = 2; $corecolumns = explode($delimiter,$columns); $parsecore = array(); $i = 1; foreach ($corecolumns as $key => $value) { $parsecore[$i] = $value; if(!empty($delimet2)){ if($value == $delimet2) { $cat = $i; }} if(!empty($delimet3)){ if($value == $delimet3) { $scat = $i; }} if(!empty($delimet4)){ if($value == $delimet4) { $sscat = $i; }} $i++; } //end echo 'Template: '.implode("|",$corecolumns)."<br>"; unset($corecolumns,$parsecore); echo 'Other Delimiter Column numbers: '.$cat." ".$scat." ".$sscat.'<br>'; if (!empty($delim2)) { if ($delim2 == 1) { $sdelimiter = "|"; } if ($delim2 == 2) { $sdelimiter = "->"; } if ($delim2 == 3) { $sdelimiter = ","; } if ($delim2 == 4) { $sdelimiter = ">"; } if ($delim2 == 5) { $sdelimiter = " > "; } if ($delim2 == 6) { $sdelimiter = "~"; } if ($delim2 == 7) { $sdelimiter = "/"; } if ($delim2 == { $sdelimiter = "\\"; } if ($delim2 == 9) { $sdelimiter = " -> "; } $columns = str_replace($sdelimiter, $delimiter, $columns); } if (!empty($delim3)) { if ($delim3 == 1) { $ssdelimiter = "|"; } if ($delim3 == 2) { $ssdelimiter = "->"; } if ($delim3 == 3) { $ssdelimiter = ","; } if ($delim3 == 4) { $ssdelimiter = ">"; } if ($delim3 == 5) { $ssdelimiter = " > "; } if ($delim3 == 6) { $ssdelimiter = "~"; } if ($delim3 == 7) { $ssdelimiter = "/"; } if ($delim3 == { $ssdelimiter = "\\"; } if ($delim3 == 9) { $ssdelimiter = " -> "; } $columns = str_replace($ssdelimiter, $delimiter, $columns); } if (!empty($delim4)) { if ($delim4 == 1) { $sssdelimiter = "|"; } if ($delim4 == 2) { $sssdelimiter = "->"; } if ($delim4 == 3) { $sssdelimiter = ","; } if ($delim4 == 4) { $sssdelimiter = ">"; } if ($delim4 == 5) { $sssdelimiter = " > "; } if ($delim4 == 6) { $sssdelimiter = "~"; } if ($delim4 == 7) { $sssdelimiter = "/"; } if ($delim4 == { $sssdelimiter = "\\"; } if ($delim4 == 9) { $sssdelimiter = " -> "; } $columns = str_replace($sssdelimiter, $delimiter, $columns); } echo 'Delimited Template Columns:'.$columns.'<br>'; $columns = explode($delimiter,$columns); //get the applicable column numbers from Template $g = 1; $cnt = 1; $newcols = array(); $actcnt[$g]; foreach($columns as $colval) { if(!empty($colval)) { $newcols[$cnt] = $colval; $actcnt[$cnt] = $g; $cnt++; } $g++; } echo '<br>Number of Applicable Delimited Columns:'.($cnt -1).'<br>'; echo 'Applicable Template Columns: '.implode('~',$newcols).'<br>'; echo 'Assigned Template Column Number: '.implode('~',$actcnt).'<br>'; //Ok lets Parse the actual RAW Data $b = 'VALUE 1|VALUE 2|VALUE 3 > VALUE 4 > VALUE 5|VALUE 6|VALUE 7|VALUE 8|VALUE 9|VALUE 10|VALUE 11->VALUE 12|VALUE 13'; echo 'Raw Values: '.$b.'<br>'; //$b = str_replace($rule, $aid, $b); $j = 1; $d = 1; $vals = array(); foreach(explode($delimiter,$b) as $values) { if(isset($cat) && $j = $cat) { foreach(explode($sdelimiter, $values) as $c) { $vals[$d] = $c; $d++; }} else { if(isset($scat) && $j = $scat) { foreach(explode($ssdelimiter, $values) as $c) { $vals[$d] = $c; $d++; }} else { if(isset($sscat) && $j = $sscat) { foreach(explode($sssdelimiter, $values) as $c) { $vals[$d] = $c; $d++; } } } } $j++; } unset($values); echo 'Parsed Values Against Template: '.implode(",",$vals); ?> Here is the output: Template: VID|VENDOR|| > TID > SID|ISBN|COLUMN1|LAST|FIRST|SSID->|COLUMN2 Other Delimiter Column numbers: 4 4 9 Delimited Template Columns:VID|VENDOR|||TID|SID|ISBN|COLUMN1|LAST|FIRST|SSID||COLUMN2 Number of Applicable Delimited Columns:10 Applicable Template Columns: VID~VENDOR~TID~SID~ISBN~COLUMN1~LAST~FIRST~SSID~COLUMN2 Assigned Template Column Number: 1~2~5~6~7~8~9~10~11~13 Raw Values: VALUE 1|VALUE 2|VALUE 3 > VALUE 4 > VALUE 5|VALUE 6|VALUE 7|VALUE 8|VALUE 9|VALUE 10|VALUE 11->VALUE 12|VALUE 13 Parsed Values Against Template: VALUE 1,VALUE 2,VALUE 3,VALUE 4,VALUE 5,VALUE 6,VALUE 7,VALUE 8,VALUE 9,VALUE 10,VALUE 11->VALUE 12,VALUE 13 I can't seem to figure out why the code won't process that last bit! Can someone take a look at this last bit of code and hopefully tell me what I am doing wrong? Thanks Quote Link to comment https://forums.phpfreaks.com/topic/186965-rework-an-array/#findComment-987401 Share on other sites More sharing options...
dyluck Posted January 3, 2010 Author Share Posted January 3, 2010 Well might as well post my solution on here. Here is the final code. Compares a template string with txt string and sorts the data by multipule delimiters: <? $columns = 'VID|VENDOR|| > TID > SID|ISBN|COLUMN1|LAST|SSID->|FIRST|COLUMN2'; $del = 1; if ($del == 3) { $delimiter = ","; } else { if ($del == 2) { $delimiter = "\t"; } else { $delimiter = "|"; } } $delimet2 = ' > TID > SID'; $delimet3 = ' > TID > SID'; $delimet4 = 'SSID->'; $delim2 = 5; $delim3 = 5; $delim4 = 2; $corecolumns = explode($delimiter,$columns); $parsecore = array(); $i = 1; foreach ($corecolumns as $key => $value) { $parsecore[$i] = $value; if(!empty($delimet2)){ if($value == $delimet2) { $cat = $i; }} if(!empty($delimet3)){ if($value == $delimet3) { $scat = $i; }} if(!empty($delimet4)){ if($value == $delimet4) { $sscat = $i; }} $i++; } //end echo 'Template: '.implode("|",$corecolumns)."<br>"; unset($corecolumns); echo 'Other Delimiter Column numbers: '.$cat." ".$scat." ".$sscat.'<br>'; if (!empty($delim2)) { if ($delim2 == 1) { $sdelimiter = "|"; } if ($delim2 == 2) { $sdelimiter = "->"; } if ($delim2 == 3) { $sdelimiter = ","; } if ($delim2 == 4) { $sdelimiter = ">"; } if ($delim2 == 5) { $sdelimiter = " > "; } if ($delim2 == 6) { $sdelimiter = "~"; } if ($delim2 == 7) { $sdelimiter = "/"; } if ($delim2 == { $sdelimiter = "\\"; } if ($delim2 == 9) { $sdelimiter = " -> "; } $columns = str_replace($sdelimiter, $delimiter, $columns); } if (!empty($delim3)) { if ($delim3 == 1) { $ssdelimiter = "|"; } if ($delim3 == 2) { $ssdelimiter = "->"; } if ($delim3 == 3) { $ssdelimiter = ","; } if ($delim3 == 4) { $ssdelimiter = ">"; } if ($delim3 == 5) { $ssdelimiter = " > "; } if ($delim3 == 6) { $ssdelimiter = "~"; } if ($delim3 == 7) { $ssdelimiter = "/"; } if ($delim3 == { $ssdelimiter = "\\"; } if ($delim3 == 9) { $ssdelimiter = " -> "; } $columns = str_replace($ssdelimiter, $delimiter, $columns); } if (!empty($delim4)) { if ($delim4 == 1) { $sssdelimiter = "|"; } if ($delim4 == 2) { $sssdelimiter = "->"; } if ($delim4 == 3) { $sssdelimiter = ","; } if ($delim4 == 4) { $sssdelimiter = ">"; } if ($delim4 == 5) { $sssdelimiter = " > "; } if ($delim4 == 6) { $sssdelimiter = "~"; } if ($delim4 == 7) { $sssdelimiter = "/"; } if ($delim4 == { $sssdelimiter = "\\"; } if ($delim4 == 9) { $sssdelimiter = " -> "; } $columns = str_replace($sssdelimiter, $delimiter, $columns); } $columns = explode($delimiter,$columns); //get the applicable column numbers from Template $g = 1; $cnt = 1; $newcols = array(); $actcnt[$g]; foreach($columns as $colval) { if(!empty($colval)) { $newcols[$cnt] = $colval; $actcnt[$cnt] = $g; $cnt++; } $g++; } echo '<br>Number of Applicable Delimited Columns:'.($cnt -1).'<br>'; echo 'Applicable Template Columns: '.implode('~',$newcols).'<br>'; echo 'Assigned Template Column Number: '.implode('~',$actcnt).'<br>'; //Ok lets Parse the actual RAW Data $b = 'VALUE 1|VALUE 2|VALUE 3|VALUE 4 > VALUE 5 > VALUE 6|VALUE 7|VALUE 8 > |VALUE 9|VALUE 10->VALUE 11|VALUE 12|VALUE 13'; echo 'Raw Values: '.$b.'<br>'; //$b = str_replace($rule, $aid, $b); $j = 1; $d = 0; $vals = array(); foreach(explode($delimiter,$b) as $key => $values) { if(!empty($cat) && $j == $cat) { foreach(explode($sdelimiter, $values) as $keys => $c) { $vals[$d] = $c; $d++; }} else { if(!empty($scat) && $j == $scat) { foreach(explode($ssdelimiter, $values) as $keys => $c) { $vals[$d] = $c; $d++; }} else { if(!empty($sscat) && $j == $sscat) { foreach(explode($sssdelimiter, $values) as $keys => $c) { $vals[$d] = $c; $d++; }} else { $vals[$d] = $values; $d++; }}} $j++; } unset($values); echo 'Parsed Values Against Template: '.implode(",",$vals); ?> Cheers all! Quote Link to comment https://forums.phpfreaks.com/topic/186965-rework-an-array/#findComment-987430 Share on other sites More sharing options...
dyluck Posted January 3, 2010 Author Share Posted January 3, 2010 Opps found an error in the last one! This works great: <? $columns = 'VID|VENDOR|| > TID > SID|ISBN|COLUMN1|LAST|SSID->|FIRST|COLUMN2'; $del = 1; if ($del == 3) { $delimiter = ","; } else { if ($del == 2) { $delimiter = "\t"; } else { $delimiter = "|"; } } $delimet2 = ' > TID > SID'; $delimet3 = ' > TID > SID'; $delimet4 = 'SSID->'; $delim2 = 5; $delim3 = 5; $delim4 = 2; $corecolumns = explode($delimiter,$columns); $parsecore = array(); $i = 1; foreach ($corecolumns as $key => $value) { $parsecore[$i] = $value; if(!empty($delimet2)){ if($value == $delimet2) { $cat = $i; }} if(!empty($delimet3)){ if($value == $delimet3) { $scat = $i; }} if(!empty($delimet4)){ if($value == $delimet4) { $sscat = $i; }} $i++; } //end echo 'Template: '.implode("|",$corecolumns)."<br>"; unset($corecolumns); echo 'Other Delimiter Column numbers: '.$cat." ".$scat." ".$sscat.'<br>'; if (!empty($delim2)) { if ($delim2 == 1) { $sdelimiter = "|"; } if ($delim2 == 2) { $sdelimiter = "->"; } if ($delim2 == 3) { $sdelimiter = ","; } if ($delim2 == 4) { $sdelimiter = ">"; } if ($delim2 == 5) { $sdelimiter = " > "; } if ($delim2 == 6) { $sdelimiter = "~"; } if ($delim2 == 7) { $sdelimiter = "/"; } if ($delim2 == { $sdelimiter = "\\"; } if ($delim2 == 9) { $sdelimiter = " -> "; } $columns = str_replace($sdelimiter, $delimiter, $columns); } if (!empty($delim3)) { if ($delim3 == 1) { $ssdelimiter = "|"; } if ($delim3 == 2) { $ssdelimiter = "->"; } if ($delim3 == 3) { $ssdelimiter = ","; } if ($delim3 == 4) { $ssdelimiter = ">"; } if ($delim3 == 5) { $ssdelimiter = " > "; } if ($delim3 == 6) { $ssdelimiter = "~"; } if ($delim3 == 7) { $ssdelimiter = "/"; } if ($delim3 == { $ssdelimiter = "\\"; } if ($delim3 == 9) { $ssdelimiter = " -> "; } $columns = str_replace($ssdelimiter, $delimiter, $columns); } if (!empty($delim4)) { if ($delim4 == 1) { $sssdelimiter = "|"; } if ($delim4 == 2) { $sssdelimiter = "->"; } if ($delim4 == 3) { $sssdelimiter = ","; } if ($delim4 == 4) { $sssdelimiter = ">"; } if ($delim4 == 5) { $sssdelimiter = " > "; } if ($delim4 == 6) { $sssdelimiter = "~"; } if ($delim4 == 7) { $sssdelimiter = "/"; } if ($delim4 == { $sssdelimiter = "\\"; } if ($delim4 == 9) { $sssdelimiter = " -> "; } $columns = str_replace($sssdelimiter, $delimiter, $columns); } $columns = explode($delimiter,$columns); //get the applicable column numbers from Template $g = 1; $cnt = 1; $newcols = array(); //$actcnt[$g]; foreach($columns as $colval) { if(!empty($colval)) { $newcols[$cnt] = $colval; $actcnt[$cnt] = $g; $cnt++; } $g++; } echo '<br>Number of Applicable Delimited Columns:'.($cnt -1).'<br>'; echo 'Applicable Template Columns: '.implode('~',$newcols).'<br>'; echo 'Assigned Template Column Number: '.implode('~',$actcnt).'<br>'; //Ok lets Parse the actual RAW Data $b = 'VALUE 1|VALUE 2|VALUE 3|VALUE 4 > VALUE 5 > VALUE 6|VALUE 7|VALUE 8 > |VALUE 9|VALUE 10->VALUE 11|VALUE 12|VALUE 13'; echo 'Raw Values: '.$b.'<br>'; //$b = str_replace($rule, $aid, $b); $j = 1; $d = 1; $vals = array(); foreach(explode($delimiter,$b) as $key => $values) { if(!empty($cat) && $j == $cat) { foreach(explode($sdelimiter, $values) as $keys => $c) { $vals[$d] = $c; $d++; }} else { if(!empty($scat) && $j == $scat) { foreach(explode($ssdelimiter, $values) as $keys => $c) { $vals[$d] = $c; $d++; }} else { if(!empty($sscat) && $j == $sscat) { foreach(explode($sssdelimiter, $values) as $keys => $c) { $vals[$d] = $c; $d++; }} else { $vals[$d] = $values; $d++; }}} $j++; } unset($values); echo 'Parsed Values Against Template: '.implode(",",$vals).'<br>'; //repack the variables $x = 0; $parsevals = array(); foreach($actcnt as $restuff) { $parsvals[$x] = $vals[$restuff]; $x++; } echo 'Parsed Values Against Template: '.implode(",",$parsvals).'<br>'; //echo the example $x = 1; foreach($parsvals as $key => $value) { echo 'cat: '.$newcols[$x].' vals: '.$value.'<br>'; $x++; } ?> Quote Link to comment https://forums.phpfreaks.com/topic/186965-rework-an-array/#findComment-987435 Share on other sites More sharing options...
laffin Posted January 3, 2010 Share Posted January 3, 2010 You got the column count wrong, you had an extra in their somewhere. instead of trying to figure out the code, just made a new routine, to do this It was quite a challenge trying to figure it out, but it looks like from your code that you already know the sub-delimiters of a column. so that made pretty easy work afterwards <?php $columns = 'VID|VENDOR|| > TID > SID|ISBN|COLUMN1|LAST|FIRST|SSID->|COLUMN2'; $delims = array(',','\t','|',' > ','->','~','/','\\',); $sdels= array( array(null,2), // apply to whole, seperate by delimeter '|' (2) array(3,3), // apply to column 3, delimter ' > ' (3) array(8,4) // apply to column 8, delimiter '->' (4) ); foreach($sdels as $dinfo) { if($dinfo[0]==null) { $cols=explode($delims[$dinfo[1]],$columns); } else { $cols[$dinfo[0]]=explode($delims[$dinfo[1]],$cols[$dinfo[0]]); } } header('Content-Type: text/plain'); var_dump($cols); $b = 'COL 0|COL 1|COL 2|COL 3 SUB 1 > COL 3 SUB 2 > COL 3 SUB 3|COL 4|COL 5|COL 6|COL 7|COL 8 SUB 1->COL 8 SUB 2|COL 9'; foreach($sdels as $dinfo) { if($dinfo[0]==null) { $vars=explode($delims[$dinfo[1]],$b); } else { $vars[$dinfo[0]]=explode($delims[$dinfo[1]],$vars[$dinfo[0]]); } } $idx=0; foreach($vars as $var) { if(is_string($var)) { $vals[$idx++]=$var; } else { foreach($var as $val) $vals[$idx++]=$val; } } var_dump($vals) ?> Quote Link to comment https://forums.phpfreaks.com/topic/186965-rework-an-array/#findComment-987440 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.