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;
}
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):
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:
I confirmed that
array_keys()
returns the keys of the array:I confirmed that I can access the array elements using
array_keys()
:I confirmed that
rand()
works in producing random values even for arrays of small sizes:
At this point I decided that I'd spent too much time perusing my code, and that I should ask for help.
php arrays
add a comment |
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):
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:
I confirmed that
array_keys()
returns the keys of the array:I confirmed that I can access the array elements using
array_keys()
:I confirmed that
rand()
works in producing random values even for arrays of small sizes:
At this point I decided that I'd spent too much time perusing my code, and that I should ask for help.
php arrays
add a comment |
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):
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:
I confirmed that
array_keys()
returns the keys of the array:I confirmed that I can access the array elements using
array_keys()
:I confirmed that
rand()
works in producing random values even for arrays of small sizes:
At this point I decided that I'd spent too much time perusing my code, and that I should ask for help.
php arrays
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):
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:
I confirmed that
array_keys()
returns the keys of the array:I confirmed that I can access the array elements using
array_keys()
:I confirmed that
rand()
works in producing random values even for arrays of small sizes:
At this point I decided that I'd spent too much time perusing my code, and that I should ask for help.
php arrays
php arrays
asked Jan 3 at 3:50


Tobi AlafinTobi Alafin
1567
1567
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
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)
.
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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)
.
add a comment |
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)
.
add a comment |
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)
.
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)
.
answered Jan 3 at 4:40
Anders KaseorgAnders Kaseorg
1,790918
1,790918
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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