Мне интересно, как работает функция PHP экстракт это работает? Я хотел бы сделать слегка модифицированную версию. Я хочу, чтобы моя функция создавала имена переменных при извлечении из ключей массива из записи змеи в camelCase, например:
Теперь извлечение делает это:
$array = ['foo_bar' => 'baz'];
extract($array);
// $foo_bar = 'baz';
Что я хотел бы это:
camelExtract($array);
// $fooBar = 'baz';
Теперь я, конечно, мог бы сначала найти массив, но было бы неплохо, если бы это можно было сделать в одной функции.
редактировать:
Кажется, некоторые люди неправильно поняли мой вопрос. Да, я мог бы сделать это:
function camelExtract($array)
{
$array = ['foo_bar' => 'baz'];
$camelCased = [];
foreach($array as $key => $val)
{
$camelCased[camelcase($key)] = $val;
}
extract($camelCased);
// $fooBar = 'baz';// I can't "return" the extracted variables here
// .. now $fooBar is only available in this scope
}
camelExtract($array);
// Not here
Но, как я уже говорил, $ fooBar виден только в этой области.
Я думаю, я мог бы сделать что-то как extract(camelCaseArray($array));
и это будет работать.
extract
, и модификация к вызываемые методы таблица локальных символов изнутри называется функция волшебная Не существует способа выполнить эквивалент в обычном PHP без его использования.
Последняя задача может быть решена с помощью предложения Джона Конде об использовании extra
после выполнение преобразования в предоставленные ключи массива; хотя я рекомендую избежать похожее на экстракт поведение. Подход будет выглядеть как
extract(camelcase_keys($arr));
где такой код не завернутый в функцию, так что extract
выполняется из области таблицы символов, в которую можно импортировать переменные.
это extract
поведение это В отличие от переменные-переменные (в вызываемой функции) и является В отличие от используя $ GLOBALS, поскольку он мутирует вызываемых (и только таблица символов) видел в этой демонстрации:
function extract_container () {
extract(array("foo" => "bar"));
return $foo;
}
echo "Extract: " . extract_container() . "\n"; // "bar" =>
echo "Current: " . $foo . "\n"; // => {no $foo in scope}
echo "Global: " . $GLOBALS['foo'] . "\n"; // => {no 'foo' in GLOBALS}
Реализация C для extract
можно найти в внутр / стандарт / array.c. Такое поведение разрешено, потому что нативная функция делает не создать новую / локальную таблицу символов PHP для себя; таким образом, разрешается (тривиально) изменять таблицу символов вызывающего контекста PHP.
Это должно работать: —
function camel(array $arr)
{
foreach($arr as $a => $b)
{
$a = lcfirst(str_replace(" ", "", ucwords(str_replace("_", " ", $a))));
$GLOBALS[$a] = $b;
}
}
Вы можете (осторожно) использовать переменные переменные:
function camelExtract($vals = array()) {
foreach ($vals as $key => $v) {
$splitVar = explode('_', $key);
$first = true;
foreach ($splitVar as &$word) {
if (!$first) {
$word = ucfirst($word);
}
$first = false;
}
$key = implode('', $splitVar);
global ${$key};
${$key} = $v;
}
}
Это было теперь проверено и функционирует как ожидалось. Это сжатый ответ (после того, как оно адресовано первому слову в нижнем регистре), также отлично работает и гораздо более сжато — мое — всего лишь «шаг за шагом», чтобы разобраться, как делается верблюд.
<?php
$arr = array('foo_bar'=>'smth');
function camelExtract($arr) {
foreach($arr as $k=>$v) {
$newName = lcfirst(str_replace(" ","",ucwords(str_replace("_"," ",$k))));
global $$newName;
$$newName = $v;
//var_dump($newName,$$newName);
}
}
camelExtract($arr);
?>
или просто как (это то, что вы предлагаете, и лучше имитировать оригинальный экстракт)
$camelArray[lcfirst(str_replace(" ","",ucwords(str_replace("_"," ",$k))))] = $v;
и извлеките полученный в результате camelArray