Function "extract ()" does not work inside the foreach loop

0

I have the following code:

<?php
        $dados = array(
            "carro" => 'Ford Focus',
            "ano" => 2007
            );


        foreach($dados as $carros):

            extract($carros);           

        endforeach;

? >

The problem:

If I report the extract($dados) out of foreach , it creates the variables with the index names of array $dados , and their respective values.

However, if I put extract($carros) inside the foreach loop, it returns me a warning that I need to report a array in extract , and that I gave string , and also, if I calling the variable $carros or $ano , returns undefined variable .

Can anyone help me here?

    
asked by anonymous 16.02.2017 / 00:13

1 answer

1

The extract function of PHP has the following syntax:

int extract ( array $var_array [, int $extract_type [, string $prefix ]] )

Parameters:

$ var_array : A variable of type array associative. For each key / value pair, the extract function creates, in the current context, a name variable equal to the key and value equal to the value. This is done by importing such variables into the current symbol table, that is, if a variable already exists with the same name, it will be overwritten.

extract_type : How new variables will be validated and / or treated:

EXTR_OVERWRITE
    Se houver uma colisão, sobrescreve a variável existente. 

EXTR_SKIP
    Se houver uma colisão, não sobrescreve a variável existente. 

EXTR_PREFIX_SAME
    Se houver uma colisão, adiciona um prefixo ao nome da variável 
    definido pelo argumento prefix. 

EXTR_PREFIX_ALL
    Adiciona um prefixo ao nome de todas as variáveis definido por prefix.

EXTR_PREFIX_INVALID
    Adiciona um prefixo definido por prefix apenas para variáveis como 
    nomes inválidos ou numéricos. 

EXTR_IF_EXISTS
    Só sobrescreve a variável se ela já existe na tabela de símbolos 
    corrente, caso contrário, não faz nada. Isso é útil quando se quer 
    definir uma lista de variáveis válidas e então extrair só as que 
    foram definidas em $_REQUEST, por exemplo. 

EXTR_PREFIX_IF_EXISTS
    Só cria nomes de variáveis usando o prefixo se na tabela de símbolos
    já existe uma variável com o nome sem esse prefixo. 

EXTR_REFS
    Extrai variáveis como referências, ou seja, os valores das variáveis
    importadas ainda estarão referenciando os valores do parâmetro 
    var_array. Essa opção pode ser usada sozinha ou em conjunto com as 
    outras usando o operador 'ou' em extract_type. 

If extract_type is not specified, the value EXTR_OVERWRITE is assumed.

prefix : Note that prefix is only required if extract_type is EXTR_PREFIX_SAME , EXTR_PREFIX_ALL , EXTR_PREFIX_INVALID or EXTR_PREFIX_IF_EXISTS . If the name with the prefix is not a valid variable name, it is not imported into the symbol table. Prefixes are automatically separated from the array key by the underscore character.

Returns an integer value for the number of variables successfully imported into the symbol table.

In rough terms, you can say that the function equivalent is:

$data = [
    "carro" => "Fiat Uno",
    "ano" => "2017"
];

foreach($data as $key => $value)
{
    ${$key} = $value;
}

echo $carro; // Fiat Uno
echo $ano;   // 2017

Calling the extract function to the array values, as you tried to do, does not make sense. Now you've talked about replacing the values in the template. From what I understand, you would have a template like:

$template = "Meu carro é {{carro}}, ano {{ano}}";

Since {{carro}} and {{ano}} would be replaced by values in variables. If so, you can do something like:

function parse ($template, array $vars)
{
    return preg_replace_callback('#{{(.*?)}}#', function($match) use ($vars) {
        extract($vars);
        return ${$match[1]};
   }, $template);
}

And doing:

echo parse($template, $data);

We would have the output: Meu carro é Fiat Uno, ano 2017 .

  

Note : This should not be the best way to do this, I just exemplified trying to understand if that is what it is. Because extract would not even be necessary in this function, since it could return the direct value of the array $data .

See working at Repl.it at Ideone and the Github Gist .

    
16.02.2017 / 01:10