Как extract () создает переменные в текущей области?

Мне интересно, как работает функция 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)); и это будет работать.

2

Решение

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.

1

Другие решения

Это должно работать: —

function camel(array $arr)
{
foreach($arr as $a => $b)
{
$a  = lcfirst(str_replace(" ", "", ucwords(str_replace("_", " ", $a))));
$GLOBALS[$a] = $b;
}
}
4

Вы можете (осторожно) использовать переменные переменные:

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;
}
}

Это было теперь проверено и функционирует как ожидалось. Это сжатый ответ (после того, как оно адресовано первому слову в нижнем регистре), также отлично работает и гораздо более сжато — мое — всего лишь «шаг за шагом», чтобы разобраться, как делается верблюд.

2

    <?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

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector