Array Problem - Trying To Find All Combinations
Moderator: General Moderators
Array Problem - Trying To Find All Combinations
Hey,
While I have seen demos online, they do not fit what I am looking for. Imagine having 2 arrays:
Array ( [gender] => male,female)
And
Array ( [age] =>18-25,26-35,36-45,46-65,65+, )
I want to basically create as many combos between the 2 as I can (total is 10). Such as
Male - 18-25
Male - 26-35 ....
Male 65+
Female 18-25
....
Female 65+
Truth is, I am pulling questions from a db and each q has answers. I want to loop through all questions
and then the answers (The above demo shows answers for question "What is your gender" and then "What is your age"
and create an array list that follows the rules above but I cannot find a way to take the data,
that I am looping through, and get it to create this permutation list.
Every example I see doesn't seem to fit what I want. I just cannot work with arrays well enough to visualize
where to start.
Just wondering if anybody had experience with something like this.
Thank you very much for your time. I appreciate it.
While I have seen demos online, they do not fit what I am looking for. Imagine having 2 arrays:
Array ( [gender] => male,female)
And
Array ( [age] =>18-25,26-35,36-45,46-65,65+, )
I want to basically create as many combos between the 2 as I can (total is 10). Such as
Male - 18-25
Male - 26-35 ....
Male 65+
Female 18-25
....
Female 65+
Truth is, I am pulling questions from a db and each q has answers. I want to loop through all questions
and then the answers (The above demo shows answers for question "What is your gender" and then "What is your age"
and create an array list that follows the rules above but I cannot find a way to take the data,
that I am looping through, and get it to create this permutation list.
Every example I see doesn't seem to fit what I want. I just cannot work with arrays well enough to visualize
where to start.
Just wondering if anybody had experience with something like this.
Thank you very much for your time. I appreciate it.
Last edited by jbh on Mon Jun 29, 2009 11:13 am, edited 1 time in total.
Re: Array Problem - Trying To Find All Permutations
Use nested loops. The one on the outside has whatever changes less often (that's the gender), the one on the inside has whatever changes most often (that's the age).
Code: Select all
$outer = array("Alice", "Bob", "Cindy");
$inner = array("Milton", "Newton", "O'Reilly", "Pratchett");
foreach ($outer as $firstname) {
foreach ($inner as $lastname) {
echo $firstname, " ", $lastname, "<br>\n";
}
}- prometheuzz
- Forum Regular
- Posts: 779
- Joined: Fri Apr 04, 2008 5:51 am
Re: Array Problem - Trying To Find All Permutations
If your arrays will always be just two of them, use the suggestion from the previous poster. However, if you have an arbitrary number of arrays, generating loops on the fly will not work AFAIK (but I know very little PHP, so that might be untrue). What I do know something about is algorithmic-trickery, so here's my suggestion of generating all combinations with an arbitrary number of arrays:jbh wrote:...
Just wondering if anybody had experience with something like this.
...
Code: Select all
function combinations($sets) {
$solutions = 1; // total solution equals 2*5*3 = 30
foreach($sets as $set) {
$solutions *= sizeof($set);
}
for($i = 0; $i < $solutions; $i++) {
$j = 1;
foreach($sets as $set) {
echo "{$set[($i/$j)%sizeof($set)]}\t";
$j *= sizeof($set);
}
echo "\n";
}
}
combinations(
array(
array('male', 'female'),
array('18-25', '26-35', '36-45', '46-65', '65+'),
array('smoking', 'drinking', 'health-freak')
)
);
/* output:
male 18-25 smoking
female 18-25 smoking
male 26-35 smoking
female 26-35 smoking
male 36-45 smoking
female 36-45 smoking
male 46-65 smoking
female 46-65 smoking
male 65+ smoking
female 65+ smoking
male 18-25 drinking
female 18-25 drinking
male 26-35 drinking
female 26-35 drinking
male 36-45 drinking
female 36-45 drinking
male 46-65 drinking
female 46-65 drinking
male 65+ drinking
female 65+ drinking
male 18-25 health-freak
female 18-25 health-freak
male 26-35 health-freak
female 26-35 health-freak
male 36-45 health-freak
female 36-45 health-freak
male 46-65 health-freak
female 46-65 health-freak
male 65+ health-freak
female 65+ health-freak
*/Re: Array Problem - Trying To Find All Permutations
Thank you for the replies. For the record, the # of arrays will be dynamic. For instance, what I am really doing is pulling a query that says
"FInd me every question where it's 'type' is segmenting (as in, a category question, not a 'yes/no' or 'correct answer' question)
I could have 3, 2, 1 or 5 at any point. If I happen to have 3:
age, gender, income then we might find that they each have the following answers attached to the question:
Age ==> 18-25, 26-35....65+
Income ==> high, low
Gender ==> male, female
So, during this query I am pulling these values, along with the 3 questions, and trying to create an associative array (I guess that's the best idea) and then trying to find a way to display all permutations.
I will try the solutions and see if they fit. I just wanted to be clear on why I need to do it and how I am doing it. I am successfully *pulling* and displaying the records, just not successfully creating the array and displaying all possibilities.
Thank you for your time, again.
"FInd me every question where it's 'type' is segmenting (as in, a category question, not a 'yes/no' or 'correct answer' question)
I could have 3, 2, 1 or 5 at any point. If I happen to have 3:
age, gender, income then we might find that they each have the following answers attached to the question:
Age ==> 18-25, 26-35....65+
Income ==> high, low
Gender ==> male, female
So, during this query I am pulling these values, along with the 3 questions, and trying to create an associative array (I guess that's the best idea) and then trying to find a way to display all permutations.
I will try the solutions and see if they fit. I just wanted to be clear on why I need to do it and how I am doing it. I am successfully *pulling* and displaying the records, just not successfully creating the array and displaying all possibilities.
Thank you for your time, again.
Re: Array Problem - Trying To Find All Permutations
Hard coding the array, as in the *2nd reply example*, works like a charm. So I just have to
create that multi-array dynamically. My test output for now, when I pull the appropriate q and corresponding answers from the db, is:
What Gender Are You?
--> male
--> female
What Age Are You?
--> 18-25
--> 26-35
--> 36-45
--> 46-65
--> 65+
So, I will dynamically build an array out of it like this, I guess:
array(
array('male', 'female'),
array('18-25', '26-35', '36-45', '46-65', '65+'));
Question is if I can turn it into a string that simulates the structure of above and then use that var in the combination function
or if I must build it another way? I will test it out but I figured I'd ask as I have not done anything like *that* before (never had to generate dynamic arrays. This is interesting)
Thanks
create that multi-array dynamically. My test output for now, when I pull the appropriate q and corresponding answers from the db, is:
What Gender Are You?
--> male
--> female
What Age Are You?
--> 18-25
--> 26-35
--> 36-45
--> 46-65
--> 65+
So, I will dynamically build an array out of it like this, I guess:
array(
array('male', 'female'),
array('18-25', '26-35', '36-45', '46-65', '65+'));
Question is if I can turn it into a string that simulates the structure of above and then use that var in the combination function
or if I must build it another way? I will test it out but I figured I'd ask as I have not done anything like *that* before (never had to generate dynamic arrays. This is interesting)
Thanks
- prometheuzz
- Forum Regular
- Posts: 779
- Joined: Fri Apr 04, 2008 5:51 am
Re: Array Problem - Trying To Find All Permutations
Well, like I said, I have little knowledge of PHP. So, unfortunately, I can't be of any more help than providing the algorithm to generate the combinations.
Re: Array Problem - Trying To Find All Permutations
NP. Your function is brilliant and will work when I can dynamically create that array
- prometheuzz
- Forum Regular
- Posts: 779
- Joined: Fri Apr 04, 2008 5:51 am
Re: Array Problem - Trying To Find All Permutations
Glad to hear that.jbh wrote:NP. Your function is brilliant and will work when I can dynamically create that array
Just one little nit-pick from my side: in your title you mentioned permutations, but, just for the record, you're looking for combinations.
Best of luck with your problem!
Re: Array Problem - Trying To Find All Combinations
May I ask how I can format it so I can display it in a neat format such as
Male | 18-25 | smoker via html while including a hidden field? Such as
<input type="hidden" name="combo" value="male_18-25_smoker">
The idea is I want it to be more readable to a visitor while I also track the values in a hidden form
because I will be appending a text field next to each printed row.
I am trying to futz with the
echo "{$set[($i/$j)%sizeof($set)]}\t";
but I cannot seem to get it to do that.
Either way, i will keep working on it, In the meantime and I really want to thank you for this.
Male | 18-25 | smoker via html while including a hidden field? Such as
<input type="hidden" name="combo" value="male_18-25_smoker">
The idea is I want it to be more readable to a visitor while I also track the values in a hidden form
because I will be appending a text field next to each printed row.
I am trying to futz with the
echo "{$set[($i/$j)%sizeof($set)]}\t";
but I cannot seem to get it to do that.
Either way, i will keep working on it, In the meantime and I really want to thank you for this.
- prometheuzz
- Forum Regular
- Posts: 779
- Joined: Fri Apr 04, 2008 5:51 am
Re: Array Problem - Trying To Find All Combinations
Perhaps this is less cryptic:
Code: Select all
function combinations($sets) {
$combs = array(); // create an array to hold all combinations
$solutions = 1; // total solution equals 2*5*3 = 30
foreach($sets as $set) {
$solutions *= sizeof($set); // calculate the total number of solutions
}
for($i = 0; $i < $solutions; $i++) {
$j = 1;
foreach($sets as $set) {
$combs[$i] .= $set[($i/$j)%sizeof($set)] . "_"; // append another element and an underscore
$j *= sizeof($set);
}
$combs[$i] = preg_replace('/_$/', '', $combs[$i]); // remove the last underscore
}
return $combs; // return all combinations
}
$combs = combinations(
array(
array('male', 'female'),
array('18-25', '26-35', '36-45', '46-65', '65+'),
array('smoking', 'drinking', 'health-freak')
)
);
print_r($combs);
/* output
Array
(
[0] => male_18-25_smoking
[1] => female_18-25_smoking
[2] => male_26-35_smoking
[3] => female_26-35_smoking
[4] => male_36-45_smoking
[5] => female_36-45_smoking
[6] => male_46-65_smoking
[7] => female_46-65_smoking
[8] => male_65+_smoking
[9] => female_65+_smoking
[10] => male_18-25_drinking
[11] => female_18-25_drinking
[12] => male_26-35_drinking
[13] => female_26-35_drinking
[14] => male_36-45_drinking
[15] => female_36-45_drinking
[16] => male_46-65_drinking
[17] => female_46-65_drinking
[18] => male_65+_drinking
[19] => female_65+_drinking
[20] => male_18-25_health-freak
[21] => female_18-25_health-freak
[22] => male_26-35_health-freak
[23] => female_26-35_health-freak
[24] => male_36-45_health-freak
[25] => female_36-45_health-freak
[26] => male_46-65_health-freak
[27] => female_46-65_health-freak
[28] => male_65+_health-freak
[29] => female_65+_health-freak
)
*/Re: Array Problem - Trying To Find All Combinations
Ok, that makes sense. PM me if you have a paypal account and first chance I want to send you a donation
Or at least send a wish list
TY for the time and for making it dummy friendly.
Or at least send a wish list
TY for the time and for making it dummy friendly.
- prometheuzz
- Forum Regular
- Posts: 779
- Joined: Fri Apr 04, 2008 5:51 am
Re: Array Problem - Trying To Find All Combinations
It really was no problem. Your appreciation is more than enough "payment" for me: there's no need for pay-palling me (besides, I don't even have such an account!).jbh wrote:Ok, that makes sense. PM me if you have a paypal account and first chance I want to send you a donation
Or at least send a wish list
TY for the time and for making it dummy friendly.
Best of luck!