jonnyenglish89 Posted April 9, 2019 Share Posted April 9, 2019 Hi guys, I’d appreciate a little guidance but I’m gonna struggle to explain what the problem is first… so apologies in advance. $drawOrder is an array of 1 to 10 letters that are drawn at random Array ( [101] => C [102] => F [103] => D [104] => J [105] => B [106] => H [107] => I [108] => G [109] => E [110] => A ) $bestOrder contains the same values as $drawOrder but the letters are given a priority. Array ( [0] => A [1] => B [2] => C [3] => D [4] => E [5] => F [6] => G [7] => H [8] => I [9] => J ) $bestPossibleOrder – I want this to contain the closest order possible to $bestOrder based on the draw order and 3 letter draw limit Array ( [101] => C [103] => D [105] => B [102] => F [106] => H [108] => G [109] => E [110] => A [107] => I [104] => J ) $availableLetters contains 3 letters that are drawn according to $drawOrder. Array ( [101] => C [102] => F [103] => D ) add “[101] => C” to $bestPossibleOrder array remove “[2] => C” from the $bestOrder array because the letters are not always unique add “[104] => J “ to $availableLetters because it is next in the draw order. Array ( [102] => F [103] => D [104] => J ) add “[103] => D” to my $bestPossibleOrder array remove “[103] => D” from the $bestOrder array because the letters are not always unique add “[102] => B“ to $availableLetters because it is next in the draw order. Array ( [102] => F [104] => J [102] => B ) Repeat the process until all letters are in the $bestPossibleOrder array Array ( [101] => C [103] => D [105] => B [102] => F [106] => H [108] => G [109] => E [110] => A [107] => I [104] => J ) I’ve attached what I’ve written so far but I’m not sure if it’s a good approach <?php $BR = "<br />"; echo "best order:" . $BR; $bestOrder = array("A","B","C","D","E","F","G","H","I","J"); print ("<pre>" . print_r($bestOrder, true) . "</pre>"); echo "draw order:" . $BR; $drawOrder = shuffle_assoc($bestOrder); $drawOrder = array_combine(range(101,(count($bestOrder)+100)),$drawOrder);// $drawOrder array keys have to start from 101 print ("<pre>" . print_r($drawOrder, true) . "</pre>"); echo "available Letters (FIRST DRAW):" . $BR; $availableLetters = array_slice($drawOrder, 0, 3,true); print ("<pre>" . print_r($availableLetters, true) . "</pre>"); $numberToPick = selectNextNumber($bestOrder,$availableLetters); echo "The key with the closest letter to best order is [" . $numberToPick . "]"; function selectNextNumber($bestOrder,$availableLetters){ for ($x = 0; $x <= count($bestOrder); $x++){ $numberToPick = array_search($bestOrder[$x], $availableLetters); if ($numberToPick !== false) { //unset($bestOrder[$x]); //print ("<pre>" . print_r($bestOrder, true) . "</pre>"); return $numberToPick; } } } function shuffle_assoc($list) { if (!is_array($list)) return $list; $keys = array_keys($list); shuffle($keys); $random = array(); foreach ($keys as $key) { $random[$key] = $list[$key]; } return $random; } Quote Link to comment Share on other sites More sharing options...
requinix Posted April 9, 2019 Share Posted April 9, 2019 Here's the English explanation of your problem, not counting the apparent importance of array keys: Quote 1. Have an array of letters sorted by priority which may have duplicates: [A, B, C, D, E, F, G, H, I, J] 2. Have an array of letters in a random order which may also have duplicates: [C, F, D, J, B, H, I, G, E, A] 3. Have an empty array to put letters in: [] 4. Draw 3 random letters: [C, F, D] While there are random letters, 5a. Add the one with the highest priority to the array: [C] 5b. Remove (the first instance of) that letter from the sorted array: [A, B, D, E, F, G, H, I, J] 5c. Draw a new random letter: [F, D, J] Random | Array | Sorted -------+---------------------+-------------------- C F D | | A B C D E F G H I J F D J | C | A B D E F G H I J F J B | C D | A B E F G H I J F J H | C D B | A E F G H I J J H I | C D B F | A E G H I J J I G | C D B F H | A E G I J J I E | C D B F H G | A E I J J I A | C D B F H G E | A I J J I | C D B F H G E A | I J J | C D B F H G E A I | J | C D B F H G E A I J | When out of letters, 6. Show the final array: [C, D, B, F, H, G, E, A, I, J] The code seems functional so far. Any particular problems? Otherwise keep going and see what happens. Quote Link to comment Share on other sites More sharing options...
jonnyenglish89 Posted April 10, 2019 Author Share Posted April 10, 2019 Thanks for the translation I could do with some help with 5b. I can remove the first instance of of the selected letter within the function selectNextNumber with unset($bestOrder[$x]) and return the updated $bestOrder array and $numberToPick is that a good way to do it or would you recommend somethingelse? Quote Link to comment Share on other sites More sharing options...
requinix Posted April 10, 2019 Share Posted April 10, 2019 selectNextNumber() will tell you an array key in $bestOrder, right? You can use that not just to determine the letter but also to then remove it from $bestOrder before the next call. Quote Link to comment Share on other sites More sharing options...
jonnyenglish89 Posted April 10, 2019 Author Share Posted April 10, 2019 Thanks Requinix Quote Link to comment 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.