EricOnAdventure Posted July 4, 2016 Share Posted July 4, 2016 Hey guys I need a bit of help with associative arrays. I am using the mysql php generator to create a rather nice searchable database. The software uses smarty as to reate page templets, that may be useful for my issue. My issue is this I want to echo an aspect of an array but I can get that to happen, if I print the array I get this: Array ( [university] => Array ( [Caption] => University [Value] => Texas A & M International University [DisplayValue] => Texas A & M International University ) [sTABBR] => Array ( [Caption] => STABBR [Value] => TX [DisplayValue] => TX ) [PREDDEG] => Array ( [Caption] => PREDDEG [Value] => 3 [DisplayValue] => 3 ) [HIGHDEG] => Array ( [Caption] => HIGHDEG [Value] => 4 [DisplayValue] => 4 ) [CONTROL] => Array ( [Caption] => CONTROL [Value] => 1 [DisplayValue] => 1 )……and so on…. how would I go about echoing only the 'university'? I’ve tried a lot of combinations, but nothing seemed to work, any idea? Quote Link to comment https://forums.phpfreaks.com/topic/301425-help-with-associative-arrays/ Share on other sites More sharing options...
Muddy_Funster Posted July 4, 2016 Share Posted July 4, 2016 when you say echoing "only the university" - what do you mean by that? Just the name? (as in the $array[...]['University']['DisplayValue']) or do you mean the full details of every $array[...]['University'] sub-array? Quote Link to comment https://forums.phpfreaks.com/topic/301425-help-with-associative-arrays/#findComment-1534207 Share on other sites More sharing options...
Muddy_Funster Posted July 4, 2016 Share Posted July 4, 2016 Going for displaying all the DisplayValue values something like the following should work: foreach ($Grid.row as $key => $uniArray){ //iterate through the top level - $uniArray holds each "University" array one at a time foreach ($uniArray as $k =>$uni){ // iterate through the items of each "University" array (Caption / Value / DisplayValue etc...) if($k == 'DisplayValue')){ echo $uni['DisplayValue'] } } } Quote Link to comment https://forums.phpfreaks.com/topic/301425-help-with-associative-arrays/#findComment-1534208 Share on other sites More sharing options...
EricOnAdventure Posted July 4, 2016 Author Share Posted July 4, 2016 Thanks muddy, I am sure that would work in normal conditions, unfortunately as this generator uses smarty the code runs into conflict with smarty's code... Here is how the page creates an output of every bit of info in the array. </table> <div class=""> <div class="col-lg-8"> {foreach from=$Grid.Row item=Cell} <div class="form-group"> <label class="col-sm-3 control-label"> {$Cell.Caption} </label> <div> <div class="form-control-static"> {$Cell.DisplayValue} </div> </div> </div> {/foreach} </div> </div> Might this help you beter understand how this system works? If I can just out the information associated with the university then I can figure out the rest. Quote Link to comment https://forums.phpfreaks.com/topic/301425-help-with-associative-arrays/#findComment-1534209 Share on other sites More sharing options...
Muddy_Funster Posted July 4, 2016 Share Posted July 4, 2016 (edited) Ahh, I've never used Smarty before, but casting an eye over the docs it looks as though it should go something like this: {foreach from=$Grid value=$row} {$row.University.DisplayValue} {/foreach} ::Edit - forgot to close foreach Edited July 4, 2016 by Muddy_Funster Quote Link to comment https://forums.phpfreaks.com/topic/301425-help-with-associative-arrays/#findComment-1534210 Share on other sites More sharing options...
Muddy_Funster Posted July 4, 2016 Share Posted July 4, 2016 (edited) In fact, having had another look over the Smarty docs I think it's actually more like: {foreach from=$Grid value=row} {$row.University.DisplayValue} {/foreach} If that doesn't go deep enough you could try: {foreach from=$Grid value=row} {foreach from=$row value=Uni} {$Uni.DisplayValue} {/foreach} {/foreach} ::Edit - missed off half the post Edited July 4, 2016 by Muddy_Funster Quote Link to comment https://forums.phpfreaks.com/topic/301425-help-with-associative-arrays/#findComment-1534211 Share on other sites More sharing options...
EricOnAdventure Posted July 4, 2016 Author Share Posted July 4, 2016 Ok thanks, that works, although I get quite a few warnings all related to line 26 in an associated file <?php $_from = $this->_tpl_vars['Grid']; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array'); }if (count($_from)): foreach ($_from as $this->_tpl_vars['row']): ?> !!!!!!line 26---> <?php echo $this->_tpl_vars['row']['University']['DisplayValue']; ?> <?php endforeach; endif; unset($_from); ?> Quote Link to comment https://forums.phpfreaks.com/topic/301425-help-with-associative-arrays/#findComment-1534212 Share on other sites More sharing options...
Muddy_Funster Posted July 4, 2016 Share Posted July 4, 2016 (edited) try changing to: <?php echo '<pre>'; var_dump($this->_tpl_vars['row']); ?> and see what comes out of that Edited July 4, 2016 by Muddy_Funster Quote Link to comment https://forums.phpfreaks.com/topic/301425-help-with-associative-arrays/#findComment-1534213 Share on other sites More sharing options...
EricOnAdventure Posted July 4, 2016 Author Share Posted July 4, 2016 What a fun approach, anywhere here is what I get, (FYI I changed the university and therefor data row from the previous data) array(0) { } bool(true) string(28) "unidata.php?operation=return" string(34) "unidata.php?operation=edit&pk0=552" bool(false) string(38) "unidata.php?operation=printrec&pk0=552" array(0) { } string(7) "Unidata" array(1) { ["id"]=> string(3) "552" } array(79) { ["University"]=> array(3) { ["Caption"]=> string(10) "University" ["Value"]=> string(23) "Saint Augustine College" ["DisplayValue"]=> string(23) "Saint Augustine College" } ["STABBR"]=> array(3) { ["Caption"]=> string(6) "STABBR" ["Value"]=> string(2) "IL" ["DisplayValue"]=> string(2) "IL" } ["PREDDEG"]=> array(3) { ["Caption"]=> string(7) "PREDDEG" ["Value"]=> string(1) "2" ["DisplayValue"]=> string(1) "2" } Quote Link to comment https://forums.phpfreaks.com/topic/301425-help-with-associative-arrays/#findComment-1534214 Share on other sites More sharing options...
Muddy_Funster Posted July 4, 2016 Share Posted July 4, 2016 OK, I think it's because you have the STABBR and PREDDEG arrays on the same level as the "University" array, so when it's going through the results it's hitting these array key names and throwing our warnings because they don't match whet you are asking it to display. Try: <?php if($this->_tpl_vars['row']['University']){echo $this->_tpl_vars['row']['University']['DisplayValue'];} ?> Quote Link to comment https://forums.phpfreaks.com/topic/301425-help-with-associative-arrays/#findComment-1534215 Share on other sites More sharing options...
EricOnAdventure Posted July 4, 2016 Author Share Posted July 4, 2016 I cant seem to make lasting changes to this file, at least not now, as the program is auto-changing this file as I make changes to my templet. I disabled warnings, thinking that would fix the issue, at least for now, and it did, except that it also helped me spot a new issue. So I am not only getting the row sent back to me, but also u for example u u u U Saint Augustine College u u u U IL, u u u U 2, This is what I get from my first three trials related to : {foreach from=$Grid item=row} {$row.XXXXXX.DisplayValue}{/foreach} XXXXXbeing whatever it is I am calling. Quote Link to comment https://forums.phpfreaks.com/topic/301425-help-with-associative-arrays/#findComment-1534216 Share on other sites More sharing options...
kicken Posted July 4, 2016 Share Posted July 4, 2016 (edited) The file you are talking about is an auto-generated compiled version of the template. You should not be changing this file except possibly for debugging problems. Smarty could re-generate it at any time by re-compiling the template. What specific warning are you getting on that line? If things are done properly then you shouldn't be seeing any warnings. Edited July 4, 2016 by kicken Quote Link to comment https://forums.phpfreaks.com/topic/301425-help-with-associative-arrays/#findComment-1534220 Share on other sites More sharing options...
kicken Posted July 4, 2016 Share Posted July 4, 2016 What a fun approach, anywhere here is what I get, (FYI I changed the university and therefor data row from the previous data) Give your output of the $row values it would seem like you need to identify whatever key contains the university details and handle it differently. What exactly does the $Grid/$row variable represent, and what output specifically are you trying to generate based on those variables? Your $row variable is obviously not always an array. In some instances it is a string, or a boolean, or an array with a different structure. Quote Link to comment https://forums.phpfreaks.com/topic/301425-help-with-associative-arrays/#findComment-1534221 Share on other sites More sharing options...
EricOnAdventure Posted July 4, 2016 Author Share Posted July 4, 2016 Hey Kicken, your right that is generated by smarty so editing that file is rather pointless So let me display what print r gives me for $grid.row and $grid I get this Array ( [university] => Array ( [Caption] => University [Value] => Texas A & M International University [DisplayValue] => Texas A & M International University ) [sTABBR] => Array ( [Caption] => STABBR [Value] => TX [DisplayValue] => TX ) [PREDDEG] => Array ( [Caption] => PREDDEG [Value] => 3 [DisplayValue] => 3 ) [HIGHDEG] => Array ( [Caption] => HIGHDEG [Value] => 4 [DisplayValue] => 4 ) [CONTROL] => Array ( [Caption] => CONTROL [Value] => 1 [DisplayValue] => 1 )……and so on…. for $Grid I also get all of the above, except I also get a few other pieces of data such as ID and database name. The warning I am getting is: Warning: Illegal string offset 'University' in C:\xampp\htdocs\uni\templates_c\%%C6^C67^C6773CE7%%gridusa.tpl.php on line 26Warning: Illegal string offset 'DisplayValue' in C:\xampp\htdocs\uni\templates_c\%%C6^C67^C6773CE7%%gridusa.tpl.php on line 26u Notice the "u" on the 2nd notice. I get 8 of these warnings and 4 "u"'s Line 26 comes from the generated file, as follows <?php $_from = $this->_tpl_vars['Grid']; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array'); }if (count($_from)): foreach ($_from as $this->_tpl_vars['row']): ?> //line 26 is the one below. <?php echo $this->_tpl_vars['row']['University']['DisplayValue']; ?> <?php endforeach; endif; unset($_from); ?> I have no idea why the U even exists, and it exists for matter what I am calling for. Any ideas? Quote Link to comment https://forums.phpfreaks.com/topic/301425-help-with-associative-arrays/#findComment-1534223 Share on other sites More sharing options...
kicken Posted July 4, 2016 Share Posted July 4, 2016 I have no idea why the U even exists, and it exists for matter what I am calling for. It exists because as can be seen from your earlier post $row is not always an array. For example: string(28) "unidata.php?operation=return" So what you end up doing in your template is the equivalent of $row = "unidata.php?operation=return"; echo $row['University']['DisplayValue']; Obviously that is wrong. You get a 'u' out of that because $row['University'] become $row[0] due to casting the index as an integer which results in the first letter of the string, 'u'. Probably what you want to do is figure out which key your university list is stored under within $Grid and only loop over that specific key, not the entire $Grid array. Quote Link to comment https://forums.phpfreaks.com/topic/301425-help-with-associative-arrays/#findComment-1534225 Share on other sites More sharing options...
EricOnAdventure Posted July 4, 2016 Author Share Posted July 4, 2016 Thanks Kicken, I've been trying to follow your advice but I haven't ended up anywhere better. in $Grid, the 3rd array is the University Key I tried everything I could think of to get it to work from this point, but everything failed. Any advice on which direction I should take this? Quote Link to comment https://forums.phpfreaks.com/topic/301425-help-with-associative-arrays/#findComment-1534226 Share on other sites More sharing options...
kicken Posted July 4, 2016 Share Posted July 4, 2016 Add var_dump($_from); just before the foreach in the generated file so you can see what $Grid contains. Find the key for the university list then change you template to {foreach from=$Grid.whateverThekeyIs item=row} Quote Link to comment https://forums.phpfreaks.com/topic/301425-help-with-associative-arrays/#findComment-1534227 Share on other sites More sharing options...
EricOnAdventure Posted July 9, 2016 Author Share Posted July 9, 2016 Thanks Kicken, I tried that but I can't seem to get it right. Here is what the var dump gives m array(10) { ["Details"]=> array(0) { } ["HasEditGrant"]=> bool(true) ["CancelUrl"]=> string(28) "unidata.php?operation=return" ["EditUrl"]=> string(32) "unidata.php?operation=edit&pk0=1" ["PrintOneRecord"]=> bool(false) ["PrintRecordLink"]=> string(36) "unidata.php?operation=printrec&pk0=1" ["ExportButtons"]=> array(0) { } ["Title"]=> string(7) "Unidata" ["PrimaryKeyMap"]=> array(1) { ["id"]=> string(1) "1" } ["Row"]=> array(79) { ["University"]=> array(3) { ["Caption"]=> string(10) "University" ["Value"]=> string(24) "Alabama A & M University" ["DisplayValue"]=> string(24) "Alabama A & M University" } ["STABBR"]=> array(3) { ["Caption"]=> string(6) "STABBR" ["Value"]=> string(2) "AL" ["DisplayValue"]=> string(2) "AL" } ["PREDDEG"]=> array(3) { ["Caption"]=> string(7) "PREDDEG" ["Value"]=> string(1) "3" ["DisplayValue"]=> string(1) "3" } ["HIGHDEG"]=> array(3) { every key combination I have tried has failed completely, any advice? Quote Link to comment https://forums.phpfreaks.com/topic/301425-help-with-associative-arrays/#findComment-1534367 Share on other sites More sharing options...
kicken Posted July 9, 2016 Share Posted July 9, 2016 If you look at the cleaned up version of that output, you can see that the key which contains the values you are interested in is Row. This means you want to be referencing $Grid.Row in your template. array(10) { ["Details"]=> array(0) { } ["HasEditGrant"]=> bool(true) ["CancelUrl"]=> string(28) "unidata.php?operation=return" ["EditUrl"]=> string(32) "unidata.php?operation=edit&pk0=1" ["PrintOneRecord"]=> bool(false) ["PrintRecordLink"]=> string(36) "unidata.php?operation=printrec&pk0=1" ["ExportButtons"]=> array(0) { } ["Title"]=> string(7) "Unidata" ["PrimaryKeyMap"]=> array(1) { ["id"]=> string(1) "1" } ["Row"]=> array(79) { ["University"]=> array(3) { ["Caption"]=> string(10) "University" ["Value"]=> string(24) "Alabama A & M University" ["DisplayValue"]=> string(24) "Alabama A & M University" } ["STABBR"]=> array(3) { ["Caption"]=> string(6) "STABBR" ["Value"]=> string(2) "AL" ["DisplayValue"]=> string(2) "AL" } ["PREDDEG"]=> array(3) { ["Caption"]=> string(7) "PREDDEG" ["Value"]=> string(1) "3" ["DisplayValue"]=> string(1) "3" } ["HIGHDEG"]=> array(3) { Now, what's next depends on what specifically you want. You say you only want to display the University, but University is an array with three values, so which value do you want? Or do you want all three? I'm going to assume you only want the DisplayValue. If so, then you don't even need a loop at all, you'd just reference it as so: $Grid.Row.University.DisplayValue 1 Quote Link to comment https://forums.phpfreaks.com/topic/301425-help-with-associative-arrays/#findComment-1534370 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.