stanoliver Posted June 30, 2019 Share Posted June 30, 2019 In the new page-meta-method (https://processwire.com/blog/posts/pw-3.0.133/#comments) there is an example how to ouput "world". Could may someone give me a snippet of code so that the output is one of the colors (red, green, blue). Link to comment Share on other sites More sharing options...
MoritzLost Posted June 30, 2019 Share Posted June 30, 2019 Just to clarify, which part don't you understand? The $data object is an associative array, so you can access the colors using the respective key: $colors = $page->meta('myData')['colors']; // ['red', 'green', 'blue'] The $colors array is an indexed / numerical array (i.e. it's not associativ), so you can access each of the colors using the numerical key of the position you want: $colors = $page->meta('myData')['colors']; // ['red', 'green', 'blue'] echo $colors[0]; // red echo $colors[2]; // blue Or are you stuck on how to use the meta method itself? 1 Link to comment Share on other sites More sharing options...
stanoliver Posted June 30, 2019 Author Share Posted June 30, 2019 @MoritzLost Thanks a lot it works! I was just not aware of the fact that I could treat "everything" as an indexed/numerical array. 1 Link to comment Share on other sites More sharing options...
MoritzLost Posted June 30, 2019 Share Posted June 30, 2019 @stanoliver Great ? Array elements that are declared without a key are implicitly numeric in PHP, so the following declarations are equivalent: $colors = [ 'red', 'green', 'blue', ]; $colors = [ 0 => 'red', 1 => 'green', 2 => 'blue', ]; You can even mix numerical and associative arrays, but that only leads to confusion in my opinion, so I would avoid it. 2 Link to comment Share on other sites More sharing options...
szabesz Posted June 30, 2019 Share Posted June 30, 2019 5 hours ago, MoritzLost said: Array elements that are declared without a key are implicitly numeric in PHP Also worth noting: https://stackoverflow.com/questions/5943149/rebase-array-keys-after-unsetting-elements 2 Link to comment Share on other sites More sharing options...
stanoliver Posted July 5, 2019 Author Share Posted July 5, 2019 @MoritzLost and @szabes First thanks for your additions. Do you guys may have an elegant solution for a related situation? Let's asume I have 5 cars in an excel-like-spreadsheet. Further I have a two rows in a datatable car1 car2 car3 car4 car5 100 200 300 400 500 (Powerhorses/PS) If I would like to export the data out of my example above to a csv-file the data in the csv-file may look like "car1";"car2";"car3";"car4";"car5"; "100";"200";"300";"400";"500"; The syntax of the array declaration $colors = [ 'red', 'green', 'blue', ]; and syntax of my spreadsheet data looks quite similiar. I would be even more similiar if my csv would look like: 'car1','car2','car3','car4','car5' '100','200','300','400','500' and therefore I could just copy-paste a raw of my csv-file so that I could become an array declaration like: $price = [ '100','200','300','400','500' ]; So the array declaration could be simple done by copy pasting out of my csv file. Now to the problem: Are their ways to adjust the working syntax/code echo $carps[0]; echo $carps[1]; echo $carps[2]; echo $carps[3]; echo $carps[4]; by a loop or also without a loop so that the whole array gets output at once without repeating myself 4 more times. Also it would be important that the adjusted code leaves a possibilty styling the output with some css. Link to comment Share on other sites More sharing options...
dragan Posted July 6, 2019 Share Posted July 6, 2019 9 hours ago, stanoliver said: Let's asume I have 5 cars in an excel-like-spreadsheet. Further I have a two rows in a datatable If you have 5 cars, then you'd have 5 rows of data (1 row = 1 record-set), not 2. 9 hours ago, stanoliver said: so that the whole array gets output at once without repeating myself 4 more times use a classic foreach loop or for debugging purposes print_r($cars) Link to comment Share on other sites More sharing options...
stanoliver Posted July 7, 2019 Author Share Posted July 7, 2019 @dragan Probably you misunderstood me. The first row in my spreadsheet is just the names/titles of the cars: 'car1','car2',..., 'car5' The second row will show the PS (Powerhorses) of my cars: '100','200','300','400','500' So 5 columns and 1 row is totally fine. A foreach loop with an icrement will work but is there no shorter/more comfortable way possible at least if my amount of cars (5 columns) will be fixed. Something like in my own "pseudo-Code": echo $carps[0-4]; which would output the ps of the first car, then the ps of the second car and so on ... Link to comment Share on other sites More sharing options...
MoritzLost Posted July 7, 2019 Share Posted July 7, 2019 @stanoliver I don't quite understand your situation, but if you have some data in an array, you have a couple of methods to output it. A simple foreach loop will keep the code at the same length regardless of how many columns you need: $prices = [ '100', '200', '300', '400', '500' ]; foreach ($prices as $price) { echo $price . ' '; } // output: // 100 200 300 400 500 // note there's one final space after "500" If you need to have something in between each item, for example a comma for CSV-style notation, you can use implode: $prices = [ '100', '200', '300', '400', '500' ]; echo implode(', ', $prices); // output: // 100, 200, 300, 400, 500 Finally, if you need to add something before or after each item or manipulate the items in some way, you can use array_map, which applies a callback function to each element of the array and returns a new array with the return values. For example, to wrap each element in double quotes for the CSV delimiters: $prices = [ '100', '200', '300', '400', '500' ]; echo implode(',', array_map(function ($price) { return '"' . $price . '"'; }, $prices)); // output: // "100","200","300","400","500" 1 Link to comment Share on other sites More sharing options...
stanoliver Posted July 11, 2019 Author Share Posted July 11, 2019 Hi @MoritzLost your provided examples just work great. Two little things I still have not found out yet: 1. In the backend I created a simple text field named "datarow". In my php-template I wanna use your example $prices = [ '100', '200', '300', '400', '500' ]; foreach ($prices as $price) { echo $price . ' '; } which just works fine. How do I have to change the code of your example if I want everything between the [ ] to be my field "datarow"? How to change the foreach? With repeating a lot of code I would do something like: $prices = [ '100', '200', '300', '400', '500' ]; // $prices2 = [ '500', '400', '300', '4040', '5400' ]; Desired output would be something like (no comes pseudocode) on a normal processwire page: foreach start $prices = [ datarow ]; // datarow ist the created simple textfield which should be editable by an enduser foreach end I tried something like <?php echo $prices=[<?= $page->datarow ?>] ; ?> which could not work because nested php-code throws errors and the foreach is not even implemented. Link to comment Share on other sites More sharing options...
MoritzLost Posted July 11, 2019 Share Posted July 11, 2019 @stanoliver Assuming the text from your datarow field looks something like this: 100,200,300,400,500 You can use the explode function to split the string into an array using the commas as a delimiter. For example: $prices = explode(',', $page->datarow); // ["100", "200", "300", "400", "500"] Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now