booxvid Posted July 24, 2012 Share Posted July 24, 2012 this is my main code <?php include 'qwerty.php'; $words = array(); $order = array('q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'); $key = array(); //for added val keys $abc = array ("a","b","c","d"); $text = "class top clone house apple blue"; $words = explode(" ",$text); $flag =""; for($i=0,$j=count($words);$i<count($words);$i++,$j--){ $add_value = 0; $next_word = $words[$i]; $fletter_nextword = Qwerty::get_first_letter($next_word); echo $fletter_nextword."<br/>"; if(!in_array($fletter_nextword,$order)){ echo "there's a number in a string"; $flag="FALSE"; break; } else{ $key_nextword = Qwerty::get_key($fletter_nextword,$order); echo $key_nextword.'<br/>'; if(in_array($key_nextword,$key)){ $key[$i] = $key_nextword.'b'; $flag = "TRUE"; } else{ $key[$i] = $key_nextword.'a'; $flag = "TRUE"; } } } if($flag!="FALSE"){ $words_key = array_combine($key,$words); ksort($words_key); foreach ($words_key as $key => $value){ echo $value.' '.$key.'</br>'; } } ?> the problem is, when I'm trying to sort these words by the assigned array, what happen is EXAMPLE: close and class does have same first letter which means, I assigned it already that if the word starts with letter c the key should be is 21 this is according to the qwerty order what happen with the words close and class... close will not be included in the printed words in a sort out qwerty order /: how to put up extra added key with the same key in it? Quote Link to comment https://forums.phpfreaks.com/topic/266169-array-is-overwritten-by-the-keys/ Share on other sites More sharing options...
Barand Posted July 24, 2012 Share Posted July 24, 2012 remove the array_combine(). Instead, put this in the loop $words_key[$key_nextword][]=$next_word; At the end foreach ($words_key as $key => $value) { echo join(', ', $value) . ' ' . $key . '</br>'; } Quote Link to comment https://forums.phpfreaks.com/topic/266169-array-is-overwritten-by-the-keys/#findComment-1364079 Share on other sites More sharing options...
DavidAM Posted July 24, 2012 Share Posted July 24, 2012 I meant to reply to your other post last night. Is this homework, or an actual application? This can be accomplished with usort and a simple callback function using a for loop and array_search -- 10 or 15 lines of code (I think). When I get home (and done baby-sitting), I'll take another look at it and provide a more detailed answer. Quote Link to comment https://forums.phpfreaks.com/topic/266169-array-is-overwritten-by-the-keys/#findComment-1364131 Share on other sites More sharing options...
DavidAM Posted July 25, 2012 Share Posted July 25, 2012 The code below will sort any array of words in "qwerty" order -- I don't know why anyone would want to, but here it is. <?php /* $CONST_order - we need to access this array in a callback function as a global. So, I gave it a special name to help prevent modifications to the array elsewhere in the application. */ $CONST_order = array('q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'); // Some sample words to be sorted $text = "class top clone house apple blue"; # $text = "classy appleoyou top class to-me home house apple4you"; // Turn the text into an array of words to be sorted $words = explode(' ', $text); print_r($words); // Sort the array based on the $CONST_order sequence usort($words, 'CB_qwertySort'); // Print the results print_r($words); exit; /* CB_qwertySort - This function accepts two words. It returns an integer indicating the "order" of the two words: -1 if $word1 is LESS THAN $word2, 0 if $word1 is EQUAL TO $word2, or +1 if $word1 is GREATER THAN $word2. Note: This function ignores the fact that there may be characters in the words that are not in the sort order. The array_search function will return FALSE, which we treat as zero, so they will sort equivalent to "q". We could easily test for this and sort these "special characters" as less than or greater than any other letter in the sort order. */ function CB_qwertySort($word1, $word2) { /* I know, globals are a no-no. But I know no other way to get the array into this function. We have taken precautions. */ global $CONST_order; $len1 = strlen($word1); $len2 = strlen($word2); $lenMin = min($len1, $len2); /* Check each character position using the length of the shorter of the words. If one word is shorter and all characters up to that length are equal, then the shorter word is LESS THAN the longer one. */ for ($i = 0; $i < $lenMin; ++$i) { $pos1 = array_search(strtolower($word1{$i}), $CONST_order); $pos2 = array_search(strtolower($word2{$i}), $CONST_order); if ($pos1 < $pos2) return -1; elseif ($pos1 > $pos2) return +1; // "+" just to be clear } /* If we get here, the words are the same, or one is shorter and they are the same for the length of the shorter word. The shorter word is considered LESS THAN the longer word */ if ($len1 < $len2) return -1; elseif($len1 > $len2) return +1; // They must be exactly the same return 0; } It's 60 lines, but if you don't count the opening php tag and the blank lines and comments, and you take out the print_r calls and the exit (which is not needed) and ignore the two setup lines at the beginning, it's 17 lines of code (2 lines over my guess) -- Damn I'm good! (I have to say that every now and then, because no one around here ever does). I use the curly-brace operator (that is an operator, right?) to index the words. Note that: $word1{0} === $word1[0]. That is, you can use the array square-brackets to index a string (as if it is an array of characters). I use the curly-brace, because it adds a level of documentation to the code. It makes it clear that $word1 is a string not some array that was passed in. I did use global but the only way I see to avoid it is to make it a class. If anyone has a suggestion, I'd like to hear it. Since the order array is all lower-case, I did the compare in lower-case, so the sort is case-insensitive. If you add the 26 Upper Case letters to the sort order array, and remove the strtolower() function calls, it will be case-sensitive. Other "issues" are documented in the code. Quote Link to comment https://forums.phpfreaks.com/topic/266169-array-is-overwritten-by-the-keys/#findComment-1364156 Share on other sites More sharing options...
booxvid Posted August 5, 2012 Author Share Posted August 5, 2012 Thanks for the reply (: Quote Link to comment https://forums.phpfreaks.com/topic/266169-array-is-overwritten-by-the-keys/#findComment-1366921 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.