PHP How do I retrieve this value? - php

I have a situation where I need to get the value of a variable, where the name od the variable is passed in a string in a second variable.
For example
$abc = 'the value I want';
$def = 'abc';
Where $def is the only variable name I can garrauntee being accessible. In this situation how can I get the value of $abc.
Cheers

echo $$def; does the job.
Use it very sparsely though, it makes code difficult to maintain!

PHP can have variable variables, like this:
${$def}
It also, incidentally, can have variable object and function names.

You can use "$$def" for this.
Examples:
http://php.net/manual/en/language.variables.variable.php

Related

Pass variable of a function in the function call

So I am writing this php function which reads a csv file and assigns every column to a variable. In the end it needs to calculate the mean of a row. I would like to pass the row (from which the mean has to calculated) in the parameters.
My question is how do I pass a variable name (including the dollar sign) of a variable of the function?
I've tried several things like:
function("$number") //this just says the variable is undefined, which is true
Same as above, but without the quotes, does the same thing of course...
function("\$number")
Not entirely sure what you're trying to do, but it sounds something like variable variables. So, if you have a variable $foo you would pass it like this: myfunc('foo'); Then myfunc might look something like this:
myfunc($var) {
global $$var;
// do stuff with $$var
}
You'd probably be better off just loading the columns into an array and looping over that in the function.
If I understood correctly, what you need is a variable variable:
$some = 'foo';
$name = 'some';
echo $$name; //displays 'foo'

PHP: How to add a variable inside other variable name?

How I can add a variable inside other variable definition?
Here is an example: $cars_list_ VARIABLE HERE [$car]
${'cars_list_'.$your_variable}[$var]
But it is extremely ugly. Use an array instead of multiple variables:
$vars_list[$your_variable][$car]
Obviously you need to change your existing code for that to work. But it's worth the time/effort.
While you could use ${'cars_list_'.$somevar}['car'], it is an extremely bad idea. Instead, you should have a multi-dimensional array that you can access with $cars_list[$somevar]['car']
You can do:
${'cars_list_' . 'other_var'} = "stuff";
echo $car_list_other_var;
Returns "stuff"

PHP Function pulling an array that matches the parameter

$youtubes = array("lNT4H39G2rw","pF2_qvdm8DQ","_8ytwhhJwco","K16ZRFWR2Mc","9WuPxe7zc6Q","rXZIIclPnd0","J8ZwyN6E3_Q","OEWJbsh0z-4","o62-X0stdFM","aIIiww2Neq0","5TJc-VbNYg0","MYQa1Tgw_z8","alxzFm-bqug","UmI7oyllrlY","RGKFXDHFmn4");
function randomFromArray($data) {
global $$data;
echo $$data[rand(0,count($youtubes)-1)];
}
randomFromArray("youtubes");
I am trying to get this to work as a function, so I can enter the array name as a parameter. It is then supposed to echo a random entry from the array. The bit where it gets the random entry from array works on its own if I substitute it straight in, but I can't seem to get it working as a function.
Any help?
You're using the variable name $youtubes in your randomFromArray function in the call to count (but the variable is not available under that name there).
Btw., why don't you pass in (a reference to) the array instead of its name? Would be much tidier than using global $$data; The following code uses a reference to avoid copying the array (but remember that then, the outside array could be changed from inside the method):
$youtubes = // ...
function randomFromArray(&$data) {
echo $data[rand(0,count($data)-1)];
}
randomFromArray($youtubes);
dont call the function randomFromArray("youtubes"); in this way you call the function with youtubes parametar like a string. and inside the function itself you dont have a $youtubes variable. call the function like this randomFromArray($youtubes);
hope this would help
You are passing the string 'youtubes' into the function, not the array. You want to pass in the name of the array:
randomFromArray($youtubes);
$youtubes = array("lNT4H39G2rw","pF2_qvdm8DQ","_8ytwhhJwco","K16ZRFWR2Mc","9WuPxe7zc6Q","rXZIIclPnd0","J8ZwyN6E3_Q","OEWJbsh0z-4","o62-X0stdFM","aIIiww2Neq0","5TJc-VbNYg0","MYQa1Tgw_z8","alxzFm-bqug","UmI7oyllrlY","RGKFXDHFmn4");
function randomFromArray($data) {
echo $data[rand(0,count($data)-1)];
}
randomFromArray($youtubes);
There are some things fundamentally wrong here.
global $$data
Why is there a double $ sign? And where would this data be coming from?
echo $$data[rand(0,count($youtubes)-1)];
Your function doesn't know the variable $youtubes, since you have never defined it inside of the function. All your function knows is the $data variable that you are passing to it.
randomFromArray("youtubes"); You are passing a string to your function, rather then your array. You probably want this instead:
randomFromArray($youtubes); // Pointing to your actual array, rather then a string
Try reading up on PHP functions first before attempting to use them as you're lacking a lot of basic knowledge about them.
After you put a ; after global $$data, you can try this: $f = $$data; and then echo $f[rand(..)]; if you really want to use names instead variables as others suggested. And if you do that you can use the string (or $f) further in the function code.

How do I get the name of a variable variable?

So, I need the actual variable name "varName" from global space. This function is actually a method inside a class.
Code is arbitrary for simplicity
$varName = 'what ever';
public function save($var)
{
$i[varName goes here] = $var;
}
I don't know if this is even possible, but I think maybe with a callback?
If it's a global variable, you might be able to find out the original name with:
$varname = array_search($var, $GLOBALS);
But that's not overly reliable; a best guess. If two global variables would contain the same value, you would just receive the name of either of them.
Read about $GLOBALS variable in the documentation.
This is probably what you need. Depending on the way you determine which variable you need, you can for example user array_search() to find the proper name based on the value.
Caution: $GLOBALS is about global scope's variables.
EDIT:
But this would be still a guess. You may try the following method to determine the name of the passed variable with ~100% certainty:
Pass variable to the method with reference.
Use array_search() for finding the name of the variable. If only one key matches it, you have your name. If not, go to the next step.
Save the initial value of the variable and save the list of positions at which you have found matching elements.
Change the variable's value into new one. Perform another search based on new value and get positions that are also in the list of positions from point no. 3.
At this point you have probably found the name of the variable you are looking for.
But...
Is it really needed? I suggest that you should look for simpler solution, some better encapsulation of your code.
Ps. array_search() actually returns no more than one key (see documentation). You should know that and make searching for multiple results a little more sophisticated to not skip the correct one if more than one variable matches your search criteria. (EDIT2: As mario suggested, array_intersect($GLOBALS, array($var)) will suffice)
In C, you would use a macro. I don't think there's an equivalent in PHP.
You could pass the name of the variable to the function as a string, then in the function get the variable's value from GLOBALS or eval it.
Thanks for the solution!
Here is my test:
<?php
$varName = 'what ever';
function save($var)
{
$i[array_search($var, $GLOBALS)] = $var;
print_r($i);
}
save($varName);
?>
prints:
Array
(
[varName] => what ever
)

What is this loop using PHP $$ syntax doing?

I found this PHP code in an app I have to modify...
$links = mysql_query($querystring);
foreach (mysql_fetch_array($links) as $key=>$value)
{
$$key = $value;
}
I'm a bit stumped.
Is it really iterating over the query results and copying the value into the key?
If so, what would be the point of this?
Also, what is the double $$ notation? I've not seen this before in PHP and I can't seem to find reference to it on the PHP site. Is it a typo? It doesn't seem to be affecting the code. I don't want to go "fixing" anything like this without understanding the consequences.
The $$ isn't a typo; it's how you interact with a variable named by another variable. Like if you do
$varname = 'foo';
$$varname = 'bar';
you've just set $foo to 'bar'.
What the loop is doing is expanding the row contents into the current variable namespace, kind of like extract(). It's a terrible way to do it, not least because it's also iterating over the numeric indices.
You generally see that written like this.
$links = mysql_query($querystring);
while ($row = mysql_fetch_array($links))
{
echo $row['id'];
}
The $$ is what's called a variable variable.
It looks like it's essentially making the keys as vars holding the value. Sort of what register_globals does to the POST/GET etc vars. I wouldn't recommend doing it this way. I dare say it will lead to problems, like overwriting vars, and unexpected vars being available.
It's creating key-value pairs based on the sql query results and result structure.
As for the $$, it's just another variable, except this time it's the result that's set to a variable.
$key = "hello";
$$key = "hi";
echo $key;
output is: "hi"
The $$ will reference the variable with the name stored in the first variable. So for example:
$var='some';
$some=15;
echo $$var;
That will print 15. It takes $vara and gets 'some', so then it takes that as a variable name because of the second $ and it prints the value of $some which is 15.
So basically that code is copying the values into a variable that has the same name as the key.

Categories