SitePoint Sponsor

User Tag List

Results 1 to 14 of 14
  1. #1
    SitePoint Zealot charles_i's Avatar
    Join Date
    Apr 2007
    Location
    Toronto, Canada
    Posts
    163
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    How do I combine 2 arrays using their keys as the final array's key?

    I have two arrays of checkbox content - the first is checked boxes:

    $checked[$checkboxID] = "<input type='checkbox' checked>";

    Second array contains the remaining unchecked boxes:

    $unchecked[$numbersNotChecked] = "<input type='checkbox'>";

    I need to combine these into one array so I can sort them using the keys I've entered above - but combine will not assign the current keys as keys in the new array - for example:

    If the above result is: $checked is key 1 and key 3 and $unchecked is key 2

    $sortedarray = $unchecked + $checked;

    will not sort $checked, $unchecked, $checked
    it will create it's own key and sort as $checked, $checked, $unchecked

    Thanks
    Charles

  2. #2
    Follow Me On Twitter: @djg gold trophysilver trophybronze trophy Dan Grossman's Avatar
    Join Date
    Aug 2000
    Location
    Philadephia, PA
    Posts
    20,578
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)
    Use array_merge to combine $checked and $unchecked, then use ksort to sort the combined array by key.

  3. #3
    SitePoint Zealot charles_i's Avatar
    Join Date
    Apr 2007
    Location
    Toronto, Canada
    Posts
    163
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    I tried array_merge but I'm not having any success with it. Here's the actual code that I used for my 2 arrays:

    $checked[$checkboxID] = array("<input type='checkbox' checked 'value='$checkboxID'><br>";
    $unchecked[$numbersNotChecked] = "<input type='checkbox 'value='$numbersNotChecked'><br>";

    The key numbers I need are actually in $checkboxID and $numbersNotChecked.

    I don't understand how the syntax works to assign these as keys. Something like this but this doesn't work because I'm trying to assign the key as itself.

    $checked = array($categoryID => $categoryID, "<input type='checkbox' checked 'value='$categoryID'><br>");

    I presume the array_merge should look like this:
    $checkboxes = array_merge((array)$checked, (array)$unchecked);
    print_r($checkboxes);

    Or do I keep my 2 arrays as they are and somehow use the keys in the array_merge?

  4. #4
    Keeper of the SFL StarLion's Avatar
    Join Date
    Feb 2006
    Location
    Atlanta, GA, USA
    Posts
    3,748
    Mentioned
    73 Post(s)
    Tagged
    0 Thread(s)
    well first of all you've got a syntax error on your first line (didnt close your array() call)

    The array syntax is this:
    $array = array([[key =>] value] [, [key =>] value]* )

    So for your example, it should be something like...
    $checked = array($categoryID => "<input type='checkbox' checked 'value='$categoryID'><br>");

  5. #5
    SitePoint Zealot charles_i's Avatar
    Join Date
    Apr 2007
    Location
    Toronto, Canada
    Posts
    163
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    The syntax error is due to me trying so many different formats - in fact I see I completely messed it up and posted two different formats for each array - when they should have been the same. I also forgot to change $categoryID in my haste to make it consistent with my first post. So here goes. As originally posted at the top, it should be:

    $checked[$checkboxID] = "<input type='checkbox' checked>";
    $unchecked[$numbersNotChecked] = "<input type='checkbox'>";

    Now for the array_merge - this is giving me a syntax ) error which I dont' see, and what's the purpose of the asterisk?

    $checkboxes = array([[key =>] $checked] [, [key =>] $unchecked]* );

    I need to add the value of each array as well. Where does it go?

    Thanks.

  6. #6
    Keeper of the SFL StarLion's Avatar
    Join Date
    Feb 2006
    Location
    Atlanta, GA, USA
    Posts
    3,748
    Mentioned
    73 Post(s)
    Tagged
    0 Thread(s)
    Asterisk is notation for 0-'infinite' (Though there is a limit, if you hit that limit you've got other troubles ) When i give the notation, [] means 'optional'.

    So all of these are valid:
    $array = array();
    $array = array(1,2,3);
    $array = array('one' => 1, 'two' => 2, 'three' => 3);
    $array = array(1,'two' => 'cow', 3=>'mreh',4);

    What is contained in $numbersNotChecked ? It sounds like thats a plural value, which wont work in the $array[$key] syntax.

  7. #7
    SitePoint Zealot charles_i's Avatar
    Join Date
    Apr 2007
    Location
    Toronto, Canada
    Posts
    163
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    No they are all single numbers - I'm trying to give them logical names - they're the numbers of the checkboxes that are not checked - but they are entered into the array one at a time.

    I understand the theory just can't figure out how to apply it to my case. The numbers I want to use as keys are in variable names - but when I cast it as an integer it works in the original array. So for testing I have 3 boxes:

    $checked array contains two numbers "1" and "3" each with the same value entered as follows:
    [$checkboxID] plus there is a value "<input type='checkbox' checked>";

    .... so it runs correctly as
    1, <input type='checkbox' checked>
    3, <input type='checkbox' checked>

    $unchecked array contains only one number "2" entered as key in [$numberNotChecked ] - I made it singular for you and this value "<input type='checkbox'>";

    .... so it runs correctly as
    2, <input type='checkbox'>

    In the merged array I want to get this:

    1, <input type='checkbox' checked>
    2, <input type='checkbox'>
    3, <input type='checkbox' checked>

    So I need to use those original key numbers as keys to sort the final array (I know there is no zero which complicates it as well).

    I thought you had to enter key values first but not according to your last example. This is where I'm getting lost.... I need to merge the arrays together in the above order, but I can't hard code 1, 2, 3 and this is not corrrect.

    $array = array(
    $checkboxID, => <input type='checkbox' checked>,
    $numberNotChecked => <input type='checkbox'>
    );

  8. #8
    Keeper of the SFL StarLion's Avatar
    Join Date
    Feb 2006
    Location
    Atlanta, GA, USA
    Posts
    3,748
    Mentioned
    73 Post(s)
    Tagged
    0 Thread(s)
    Okay, lets try it this way. Show me how you're filling $checked and $unchecked, and i'll tell you how to merge them.

  9. #9
    SitePoint Zealot charles_i's Avatar
    Join Date
    Apr 2007
    Location
    Toronto, Canada
    Posts
    163
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    OK here's all the code as I now have it and it gives the correct result. Category is just the name of this group of checkboxes.

    Thanks!


    Code:
    if(isset($_POST['category'])){ 
    
       $checked = $_POST['category'];			
       $checkboxNum = $_POST['count'];
       $checkboxNum = $checkboxNum-1;
    		
       $counter = 0;			
    
       //put the checked ID numbers into $checked array
       foreach ($checked as $checkboxID) {	
    
       //cast the variable to an integer to use as array key
       $checkboxID = (integer)$checkboxID;
       $checked[$checkboxID] = "<input type='checkbox' checked 'value='$checkboxID'>";			
    		
       $counter = $counter+1;	
       
    }
    
    echo "checked "; print_r ($checked); echo "<br>";
    
    //put the total number of categories into an array to loop through each one later
    
    $boxNum = array();
    
    //get the $checkedNum - the total number of categories
    
    $checkedNum = $_POST['count'];
    $checkedNum = $checkedNum-1;
    				
    $counter = 0;
    while ($counter < $checkedNum){
       $checkNum = $counter+1;					
       $boxNum [] = $checkNum;				
       $counter = $counter + 1;				
    
    				}
    //for each of the total category numbers
    foreach ($boxNum as $numberBoxs){
       foreach ($checked as $checkboxID){
    
       //if the checked number is the same as one of the total category numbers
          if ($checkboxID == $numberBoxs){						
    	
          //remove that number using $boxNum by its value with array difference						
          $boxNum = array_diff($boxNum, array($checkboxID));						
          }	
       }				
    }
    
    //what's left is unchecked
    $unchecked = array();
    
    foreach ($boxNum as $numberBox){	
       //cast the variable to an integer to use as array key
       $numberBox = (integer)$numberBox;
       $unchecked[$numberBox] = "<input type='checkbox' 'value='$numberBox'><br>";
       echo "Unchecked ".$numberBox."<br>";	
    }

  10. #10
    Keeper of the SFL StarLion's Avatar
    Join Date
    Feb 2006
    Location
    Atlanta, GA, USA
    Posts
    3,748
    Mentioned
    73 Post(s)
    Tagged
    0 Thread(s)
    Okay. I'm trying to wrap my head around this. See if i've got this right.

    Your post values contain 'category', which is an array of category ID's that should be checked.
    It also contains 'count', which is the total number of categories.
    Your intention is to create an array of HTML tags which have a key of 0..count and the corresponding checked/not-checked HTML.

    PHP Code:
    $count = (isset($_POST['count'])) ? (int) $_POST['count'] : 0;
    $span range(0,$count);
    $html = array();
    foreach(
    $span as $key) {
      
    $html[] = "<input type='checkbox' value='$key' ".((in_array($_POST['category'],$key)) ? 'checked' '').">";

    should... do what you wanted?

  11. #11
    SitePoint Zealot charles_i's Avatar
    Join Date
    Apr 2007
    Location
    Toronto, Canada
    Posts
    163
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    I think you have the concept correct. It's actually 3 checkboxes:

    Category

    text description [HTML box 1]
    text description [HTML box 2]
    text description [HTML box 3]

    I want to put them back in the same order no matter which ones have been checked.

    the $html [] line is giving this error:

    Warning: in_array() expects parameter 2 to be array, integer given

  12. #12
    Keeper of the SFL StarLion's Avatar
    Join Date
    Feb 2006
    Location
    Atlanta, GA, USA
    Posts
    3,748
    Mentioned
    73 Post(s)
    Tagged
    0 Thread(s)
    Er yeah. got my parameters backwards there. Should have been $key,$_POST['category']

  13. #13
    SitePoint Zealot charles_i's Avatar
    Join Date
    Apr 2007
    Location
    Toronto, Canada
    Posts
    163
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Perfect!!!

    Thanks so much. You're a hero.

  14. #14
    SitePoint Zealot charles_i's Avatar
    Join Date
    Apr 2007
    Location
    Toronto, Canada
    Posts
    163
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    One final note I forgot to add. I had to change the loop to run like this.

    $span = range(1,$count-1);

    Because the the HTML boxes start at 1 not 0.

    Thanks again.
    Charles


Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •