Jump to content

page meta


stanoliver
 Share

Recommended Posts

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?

  • Like 1
Link to comment
Share on other sites

@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.

  • Like 2
Link to comment
Share on other sites

@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

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

@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

@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"

 

  • Like 1
Link to comment
Share on other sites

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...