• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

cyclop

Defenir valor num nivel de array

5 mensagens neste tópico

Boa tarde a todos, tenho estado a ter alguns problemas no desenvolvimento de um algoritmo, queria defenir o valor de um dado nivel da array dinamicamente, e passo a exemplificar

$array = array();
$array['node1']['nivel1']['nivel2']['nivel3'] = array('key1'=>'valor','key2'=>'valor','key3'=>'valor');
$array['node2']['nivel1']['nivel1'] = array('key1'=>'valor','key2'=>'valor','key1'=>'valor');

imaginemos que eu quero adicionar a "key4 com o valor teste" no nivel 3, como poderia fazer com uma função dinâmica(estou a tentar actualmente a recursividade para tentar defenir esse mesmo valor mas ainda sem sucesso...)

Obrigado a todos os que poderem ajudar. :)

NOTA: não gostava de ter de ter de usar o EVAL.... (isto seria a maneira mais simples de resolver este problema)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Recorrendo à recursividade, é só passar arrays por referência. Algo deste género:

function add($level, $key, $value, &$array, $currlevel = 0){
    if($currlevel == $level){
        $array[$key] = $value;
    }else{
        $currlevel++;
        add($level, $key, $value, $array['nivel'.(str) $currlevel], $currlevel);
    }
    return $array;
}

add(3, 'ois', 'ddtc', array()) deve retornar algo como array('nivel1' => array('nivel2' => array('nivel3' => array('ois' => 'ddtc')))).

Não testei, mas deve funcionar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado djthyrax pela ajuda mas a função que criaste dará unicamente se a array respeitar os id's "nivel{numero}" e a "finalidade" é nao seguir logica  ex: $array['rse5yrtyru']['ruiu567yity']['iyu345ououiy']['uyiuytiyu']

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, eu não sabia disso :)

De qualquer maneira, já resolveste o problema? If not, podes dar um output do var_dump() duma array dessas?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

DONE :thumbsup:

echo '<pre>';

$array = array();
$array['node1']['nivel1']['nivel2']['nivel3'] = array('key1'=>'valor','key2'=>'valor','key3'=>'valor');
$array['node2']['nivel1']['nivel1'] = array('key1'=>'valor','key2'=>'valor','key1'=>'valor');

function add ($index = array(), &$arrayInput = array(), $arrayAdd = array(), $level = 0)
{  
    if ($level == count($index))
    {
        $arrayInput[$arrayAdd['key']] = $arrayAdd['value'];
    }
    else
    {      
        add($index, $arrayInput[$index[$level]], $arrayAdd, ($level+1));
    }
    return $arrayInput;
}


$input = array(0=> 'node1',1 => 'nivel1' , 2 => 'nivel2' , 3 => 'nivel3');

$add=array('key'=>'key4','value'=>'valor do 4');

print_r(add($input, $array, $add));

A ideia aqui é fazer uma optimização de código CSS esta função irá servir para "não duplicar código" de css :)

Obrigado djthyrax

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora