Я получаю много массива от некоторого API, и мне нужно проверить, существует ли какая-то переменная или нет.
У меня есть много блоков, которые выглядят так:
if (isset($var))
$varToSet = $var;
else
$varToSet = '';
Поэтому я решил сделать функцию для этого. Я пришел с этим:
function setVar($var)
{
if (isset($var))
return $var;
return '';
}
Но, как я и ожидал, я получил ошибку Undefined variable
Я понял, что мне нужно передать аргумент по ссылке, чтобы получить следующий прототип:
function setVar(&$var);
И до сих пор это работало отлично, вот пример моей проблемы:
// works fine
$var = "test";
$varToSet = setVar($var);
// works fine
$var = "test";
$varToSet = setVar($doesNotExist);
// works fine
$var = "test";
$varToSet = setVar($doesNotExist['index']);
// doesn't work
$var = "test";
$varToSet = setVar($var['index']);
В последнем примере я получаю Illegal string offset 'index
а также Only variables can be passed by reference
Ошибки PHP.
Я знаю, почему я получил эти ошибки, я просто не могу понять, как преодолеть эту проблему.
я в основном использую property_exists, чтобы проверить, существует ли значение в объекте json.
function getFromJson($json,$value)
{
if (property_exists(json, $value)) {
return $json->$value;
}
return null;
}
function get($var,$value = null)
{
if (is_null($value)) {
return $var;
}
if (is_object($var) && property_exists($var, $value)) {
return $json->$value;
}
if (is_array($var)) {
return $var[$value];
}
return $var;
}
Ошибка дает вам ответ. Ваша переменная является строкой. Но вы пытаетесь получить доступ к элементу массива, используя скобки [].
И второе вызвано неправильной ссылкой.
Это проходит по ссылке:
$variable = 'test';
myFunction($variable);
и это проходит по значению:
myFunction('test');
Это большая разница!
Вы не можете вызвать строку как массив
$varToSet = setVar($var['index']);
Вы можете изменить строку на:
echo $var['index'];
и у вас все равно будет та же ошибка / предупреждение.
Если вы хотите проверить, установлена ли переменная массива, используйте
isset($var['index'])
но он возвращает значение, а не ссылку