Napper Posted January 27, 2008 Share Posted January 27, 2008 Hi everybody, I am not getting anywhere with this. Could somebody throw me a pointer into the right direction? I have an array with a whole bunch of phrases. To make it easier for my user to navigate through this huge list I want to do split that array based on the first characters of the words. So I need a function that goes through the array and collects all the text strings that _start_ with "A" and puts them into a new array. I also have a special case where I need to find all the text strings that start with "Color ". What function would be best to use here? Greetings, Napper Quote Link to comment https://forums.phpfreaks.com/topic/88029-solved-splitting-arrays-based-on-first-characters/ Share on other sites More sharing options...
ziv Posted January 27, 2008 Share Posted January 27, 2008 any iteration will cost you the same. so, using a for statement, or using array_walk (or similar) function will do the job. Quote Link to comment https://forums.phpfreaks.com/topic/88029-solved-splitting-arrays-based-on-first-characters/#findComment-450387 Share on other sites More sharing options...
Barand Posted January 27, 2008 Share Posted January 27, 2008 try <?php $ar = array ( 'A stitch in time saves nine', 'Birds of a feather flock together', 'All that glisters is not gold', 'Bat and ball', 'Color red', 'A fool and his money are soon parted', 'Color yellow' ); $phrases = array(); foreach ($ar as $line) { if (strpos($line, 'Color')===0) { $phrases['color'][] = $line; } else { $phrases[$line[0]][] = $line; // $line[0] is first char of the line } } echo '<pre>', print_r($phrases, true), '</pre>'; ?> Quote Link to comment https://forums.phpfreaks.com/topic/88029-solved-splitting-arrays-based-on-first-characters/#findComment-450390 Share on other sites More sharing options...
Napper Posted January 27, 2008 Author Share Posted January 27, 2008 What can I say Barand? Beautiful! I was just fiddling around with Zivs array_walk idea, when your post poppled up. I rebuilt the function now to be case-insensitive: <?php $phrases = array(); foreach ($array_all_keywords as $line) { if (stripos($line, 'a')===0) { $phrases['A'][] = $line; } elseif (stripos($line, 'b')===0) { $phrases['B'][] = $line; } elseif (stripos($line, 'c')===0) { $phrases['C'][] = $line; } elseif (stripos($line, 'd')===0) { $phrases['D'][] = $line; } elseif (stripos($line, 'e')===0) { $phrases['E'][] = $line; } elseif (stripos($line, 'f')===0) { $phrases['F'][] = $line; } elseif (stripos($line, 'g')===0) { $phrases['G'][] = $line; } elseif (stripos($line, 'h')===0) { $phrases['H'][] = $line; } elseif (stripos($line, 'i')===0) { $phrases['I'][] = $line; } elseif (stripos($line, 'j')===0) { $phrases['J'][] = $line; } elseif (stripos($line, 'k')===0) { $phrases['K'][] = $line; } elseif (stripos($line, 'l')===0) { $phrases['L'][] = $line; } elseif (stripos($line, 'm')===0) { $phrases['M'][] = $line; } elseif (stripos($line, 'n')===0) { $phrases['N'][] = $line; } elseif (stripos($line, 'o')===0) { $phrases['O'][] = $line; } elseif (stripos($line, 'p')===0) { $phrases['P'][] = $line; } elseif (stripos($line, 'q')===0) { $phrases['Q'][] = $line; } elseif (stripos($line, 'r')===0) { $phrases['R'][] = $line; } elseif (stripos($line, 's')===0) { $phrases['S'][] = $line; } elseif (stripos($line, 't')===0) { $phrases['T'][] = $line; } elseif (stripos($line, 'u')===0) { $phrases['U'][] = $line; } elseif (stripos($line, 'v')===0) { $phrases['V'][] = $line; } elseif (stripos($line, 'w')===0) { $phrases['W'][] = $line; } elseif (stripos($line, 'x')===0) { $phrases['X'][] = $line; } elseif (stripos($line, 'y')===0) { $phrases['Y'][] = $line; } elseif (stripos($line, 'z')===0) { $phrases['Z'][] = $line; } else { $phrases['#'][] = $line; } } echo '<pre>', print_r($phrases, true), '</pre>'; ?> A bit more tricky however, is the next bit. I want the programm to bundle Strings that start the same (basically strings that are the same until the first emtpy space) in order to manipulate of how they are displayed. Let's say you have that array: <?php $ar = array ( 'A stitch in time saves nine', 'Birds of a feather flock together', 'All that glisters is not gold', 'type Hat', 'Bat and ball', 'Color red', 'Type trouser', 'A fool and his money are soon parted', 'Color yellow', 'color green', 'type baggy' ); ?> And you want to find all the Colors and types, except that you don't know that the strings you are looking for start with "Color " or "Type" you just want all the instances that start the same bundled together. The occurance of strings that start the same is user dependent, so I don't know, which words to search for. Trying to figure this out right now. Any ideas? Quote Link to comment https://forums.phpfreaks.com/topic/88029-solved-splitting-arrays-based-on-first-characters/#findComment-450415 Share on other sites More sharing options...
sasa Posted January 27, 2008 Share Posted January 27, 2008 <?php $ar = array ( 'A stitch in time saves nine', 'Birds of a feather flock together', 'All that glisters is not gold', 'type Hat', 'Bat and ball', 'Color red', 'Type trouser', 'A fool and his money are soon parted', 'Color yellow', 'color green', 'type baggy' ); foreach ($ar as $s){ $k = explode(' ',$s); $k = $k[0]; $k = strtolower($k); //remove for case sensitiv $out[$k][] = $s; } foreach ($out as $k => $s){ if (count($s) == 1){ $out[substr($k, 0, 1)][]=$s[0]; unset ($out[$k]); } } print_r($out); ?> Quote Link to comment https://forums.phpfreaks.com/topic/88029-solved-splitting-arrays-based-on-first-characters/#findComment-450427 Share on other sites More sharing options...
Napper Posted January 27, 2008 Author Share Posted January 27, 2008 Hi Sasa! Thanks for the quick help. This is almost working the way I need it. I will post my complete code once it is done (still a few quirks, because the actual code is more complex...) Still, this is already doing wonders. Problem definetly solved! Kind regards, Napper Quote Link to comment https://forums.phpfreaks.com/topic/88029-solved-splitting-arrays-based-on-first-characters/#findComment-450692 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.