Shuffle Function Doesn't Shuffle Array Elements (PHP)





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







3















I'm learning PHP by working through a book. I realised that PHP's inbuilt shuffle() function destroys key-value associations upon shuffling. So I decided to write my own shuffling function that would keep the original array keys but would map them to different values (how hard can it be I thought)? An hour later, I'm still unable to get the function to work, so I decided I'm better served throwing in the towel on this and seeking help. I would outline the (final version of the) the function, and then explain what I've tried so far.





My Code



<?
function swap(&$a, &$b)
{
$tmp = $a;
$a = $b;
$b = $tmp;
}

function shuffleX($arr) #Shuffles the key-value associations in an array.
{
$keys = array_keys($arr); #extract the keys from the array.
$length = count($keys);
$i = 0; #Index.
while ($i < $length-1)
{
$target = rand(($i+1), $length-1); #This ensures that no value ends up mapped to the same key.
swap($arr[$keys[$i]], $arr[$keys[$target]]); #Swap each element of the array with another.
$i++;
}
}
?>


The array I used for testing purposes was: $statesX = ["CA" => "California", "NY" => "New York", "FL" => "Florida", "WA"=> "Washington"];

I tested this function in the PHP interactive shell (shuffleX() is renamed because I can't redefine already defined functions, so I copy-paste and change the name whenever I edit something):
enter image description here





My Attempts at Solving the Problem (Not Necessarily in Chronological Order)




  • I confirmed that swap is working and that it indeed swaps key-value associations for associative arrays:
    enter image description here


  • I confirmed that array_keys() returns the keys of the array:
    enter image description here


  • I confirmed that I can access the array elements using array_keys():
    enter image description here


  • I confirmed that rand() works in producing random values even for arrays of small sizes:
    enter image description here



At this point I decided that I'd spent too much time perusing my code, and that I should ask for help.










share|improve this question





























    3















    I'm learning PHP by working through a book. I realised that PHP's inbuilt shuffle() function destroys key-value associations upon shuffling. So I decided to write my own shuffling function that would keep the original array keys but would map them to different values (how hard can it be I thought)? An hour later, I'm still unable to get the function to work, so I decided I'm better served throwing in the towel on this and seeking help. I would outline the (final version of the) the function, and then explain what I've tried so far.





    My Code



    <?
    function swap(&$a, &$b)
    {
    $tmp = $a;
    $a = $b;
    $b = $tmp;
    }

    function shuffleX($arr) #Shuffles the key-value associations in an array.
    {
    $keys = array_keys($arr); #extract the keys from the array.
    $length = count($keys);
    $i = 0; #Index.
    while ($i < $length-1)
    {
    $target = rand(($i+1), $length-1); #This ensures that no value ends up mapped to the same key.
    swap($arr[$keys[$i]], $arr[$keys[$target]]); #Swap each element of the array with another.
    $i++;
    }
    }
    ?>


    The array I used for testing purposes was: $statesX = ["CA" => "California", "NY" => "New York", "FL" => "Florida", "WA"=> "Washington"];

    I tested this function in the PHP interactive shell (shuffleX() is renamed because I can't redefine already defined functions, so I copy-paste and change the name whenever I edit something):
    enter image description here





    My Attempts at Solving the Problem (Not Necessarily in Chronological Order)




    • I confirmed that swap is working and that it indeed swaps key-value associations for associative arrays:
      enter image description here


    • I confirmed that array_keys() returns the keys of the array:
      enter image description here


    • I confirmed that I can access the array elements using array_keys():
      enter image description here


    • I confirmed that rand() works in producing random values even for arrays of small sizes:
      enter image description here



    At this point I decided that I'd spent too much time perusing my code, and that I should ask for help.










    share|improve this question

























      3












      3








      3








      I'm learning PHP by working through a book. I realised that PHP's inbuilt shuffle() function destroys key-value associations upon shuffling. So I decided to write my own shuffling function that would keep the original array keys but would map them to different values (how hard can it be I thought)? An hour later, I'm still unable to get the function to work, so I decided I'm better served throwing in the towel on this and seeking help. I would outline the (final version of the) the function, and then explain what I've tried so far.





      My Code



      <?
      function swap(&$a, &$b)
      {
      $tmp = $a;
      $a = $b;
      $b = $tmp;
      }

      function shuffleX($arr) #Shuffles the key-value associations in an array.
      {
      $keys = array_keys($arr); #extract the keys from the array.
      $length = count($keys);
      $i = 0; #Index.
      while ($i < $length-1)
      {
      $target = rand(($i+1), $length-1); #This ensures that no value ends up mapped to the same key.
      swap($arr[$keys[$i]], $arr[$keys[$target]]); #Swap each element of the array with another.
      $i++;
      }
      }
      ?>


      The array I used for testing purposes was: $statesX = ["CA" => "California", "NY" => "New York", "FL" => "Florida", "WA"=> "Washington"];

      I tested this function in the PHP interactive shell (shuffleX() is renamed because I can't redefine already defined functions, so I copy-paste and change the name whenever I edit something):
      enter image description here





      My Attempts at Solving the Problem (Not Necessarily in Chronological Order)




      • I confirmed that swap is working and that it indeed swaps key-value associations for associative arrays:
        enter image description here


      • I confirmed that array_keys() returns the keys of the array:
        enter image description here


      • I confirmed that I can access the array elements using array_keys():
        enter image description here


      • I confirmed that rand() works in producing random values even for arrays of small sizes:
        enter image description here



      At this point I decided that I'd spent too much time perusing my code, and that I should ask for help.










      share|improve this question














      I'm learning PHP by working through a book. I realised that PHP's inbuilt shuffle() function destroys key-value associations upon shuffling. So I decided to write my own shuffling function that would keep the original array keys but would map them to different values (how hard can it be I thought)? An hour later, I'm still unable to get the function to work, so I decided I'm better served throwing in the towel on this and seeking help. I would outline the (final version of the) the function, and then explain what I've tried so far.





      My Code



      <?
      function swap(&$a, &$b)
      {
      $tmp = $a;
      $a = $b;
      $b = $tmp;
      }

      function shuffleX($arr) #Shuffles the key-value associations in an array.
      {
      $keys = array_keys($arr); #extract the keys from the array.
      $length = count($keys);
      $i = 0; #Index.
      while ($i < $length-1)
      {
      $target = rand(($i+1), $length-1); #This ensures that no value ends up mapped to the same key.
      swap($arr[$keys[$i]], $arr[$keys[$target]]); #Swap each element of the array with another.
      $i++;
      }
      }
      ?>


      The array I used for testing purposes was: $statesX = ["CA" => "California", "NY" => "New York", "FL" => "Florida", "WA"=> "Washington"];

      I tested this function in the PHP interactive shell (shuffleX() is renamed because I can't redefine already defined functions, so I copy-paste and change the name whenever I edit something):
      enter image description here





      My Attempts at Solving the Problem (Not Necessarily in Chronological Order)




      • I confirmed that swap is working and that it indeed swaps key-value associations for associative arrays:
        enter image description here


      • I confirmed that array_keys() returns the keys of the array:
        enter image description here


      • I confirmed that I can access the array elements using array_keys():
        enter image description here


      • I confirmed that rand() works in producing random values even for arrays of small sizes:
        enter image description here



      At this point I decided that I'd spent too much time perusing my code, and that I should ask for help.







      php arrays






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Jan 3 at 3:50









      Tobi AlafinTobi Alafin

      1567




      1567
























          1 Answer
          1






          active

          oldest

          votes


















          1














          Your shuffleX function accepts the array by value. In order for the caller to see its modifications, it needs to accept the array by reference: function shuffleX(&$arr).






          share|improve this answer
























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54016119%2fshuffle-function-doesnt-shuffle-array-elements-php%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            1














            Your shuffleX function accepts the array by value. In order for the caller to see its modifications, it needs to accept the array by reference: function shuffleX(&$arr).






            share|improve this answer




























              1














              Your shuffleX function accepts the array by value. In order for the caller to see its modifications, it needs to accept the array by reference: function shuffleX(&$arr).






              share|improve this answer


























                1












                1








                1







                Your shuffleX function accepts the array by value. In order for the caller to see its modifications, it needs to accept the array by reference: function shuffleX(&$arr).






                share|improve this answer













                Your shuffleX function accepts the array by value. In order for the caller to see its modifications, it needs to accept the array by reference: function shuffleX(&$arr).







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Jan 3 at 4:40









                Anders KaseorgAnders Kaseorg

                1,790918




                1,790918
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54016119%2fshuffle-function-doesnt-shuffle-array-elements-php%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    MongoDB - Not Authorized To Execute Command

                    How to fix TextFormField cause rebuild widget in Flutter

                    Npm cannot find a required file even through it is in the searched directory