Jump to content


Photo

Função Não Altera Array De Modo Permanente


  • Faça o login para participar
4 replies to this topic

#1 awls99

awls99

    Novato no fórum

  • Usuários
  • 2 posts
  • Sexo:Não informado

Posted 27/04/2009, 06:54

Bom dia.
Para ja pesso desculpas se o problema é um pocado noob, mas eu sou um cadinho noob em php.

O meu problema é o seguinte, eu uso uma função para fazer algumas comparações entre arrays, informção do session e a base de dados e no fim deste processo atribuir a uma das arrays um novo index com o resultado das comparações.
function checkwhattodo($coiso, $n, $array){

//grande query, comparações usando if e dps um switch

switch ($editar){
		  case 'noteam':
							$array[$n]["texto"] = 'criar equipa neste evento';
							alert('1');
							break;
		  case 'npodes':
							 $array[$n]["texto"] = 'equipas trancadas';
							 alert('w');
							break;
		  case 'podes':
							 $array[$n]["texto"] = 'editar equipa';  // [b][u]este é o caso que acontece sempre durante o teste[/u][/b]
							 var_dump ( $array); //para efeitos de debug
							 echo '<br>';
							 alert('3');
							break;
		  default:
							 $array[$n]["texto"] = 'alguem fez xxxxxx';
							 alert('4');
							break;

}
eu ja verifiquei e todo o resto da função esta a funcionar correctamente, dps a frente no codigo tenho o seguinte:
checkwhattodo($eventteam, $n, $eventos);
var_dump ($eventos);

era suposto que a função checkwahttodo modificasse o array $eventos, mas quando comparo os dois var_dumps (o que ta na função e o que ta fora dela) verifico que as modificações ao array não sairam da função.

array(2) { [0]=> array(12) { ["eid"]=> string(1) "1" ["nome"]=> string(15) "evento de teste" ["sigla"]=> string(7) "T.E.S.T" ["localizacao"]=> string(7) "My head" ["foto"]=> NULL ["descricao"]=> string(25) "Evento para testar o site" ["maxparticipantes"]=> string(1) "5" ["datainicio"]=> string(19) "2009-04-20 00:00:00" ["datafim"]=> string(19) "2010-04-20 00:00:00" ["datalimitealt"]=> string(19) "2009-06-20 00:00:00" ["nmaxalt"]=> string(1) "5" ["texto"]=> string(13) "editar equipa" } [1]=> array(11) { ["eid"]=> string(1) "2" ["nome"]=> string(21) "mais testes eventuais" ["sigla"]=> string(7) "EZ TEST" ["localizacao"]=> string(9) "My laptop" ["foto"]=> NULL ["descricao"]=> string(22) "Outro evento pa testar" ["maxparticipantes"]=> string(1) "5" ["datainicio"]=> string(19) "2100-04-01 00:00:00" ["datafim"]=> string(19) "2100-04-02 00:00:00" ["datalimitealt"]=> string(19) "2100-04-01 00:00:00" ["nmaxalt"]=> string(1) "2" } }
array(2) { [0]=> array(11) { ["eid"]=> string(1) "1" ["nome"]=> string(15) "evento de teste" ["sigla"]=> string(7) "T.E.S.T" ["localizacao"]=> string(7) "My head" ["foto"]=> NULL ["descricao"]=> string(25) "Evento para testar o site" ["maxparticipantes"]=> string(1) "5" ["datainicio"]=> string(19) "2009-04-20 00:00:00" ["datafim"]=> string(19) "2010-04-20 00:00:00" ["datalimitealt"]=> string(19) "2009-06-20 00:00:00" ["nmaxalt"]=> string(1) "5" } [1]=> array(11) { ["eid"]=> string(1) "2" ["nome"]=> string(21) "mais testes eventuais" ["sigla"]=> string(7) "EZ TEST" ["localizacao"]=> string(9) "My laptop" ["foto"]=> NULL ["descricao"]=> string(22) "Outro evento pa testar" ["maxparticipantes"]=> string(1) "5" ["datainicio"]=> string(19) "2100-04-01 00:00:00" ["datafim"]=> string(19) "2100-04-02 00:00:00" ["datalimitealt"]=> string(19) "2100-04-01 00:00:00" ["nmaxalt"]=> string(1) "2" } }


Todo o resto da função foi testada, usando var_dump e alerts para descubrir onde estava o erro, mas no fim descobri isto e simplesmente tou sem ideias de como resolver.

Agradeço com antedecencia a vossa ajuda.

PS.: So para exclarecer, a variavel $eventos é uma array bi-dimiensional ANTES da execução da função, resultado de um select de mysql.

Edição feita por: awls99, 27/04/2009, 06:58.


#2 CMAC

CMAC

    Normal

  • Usuários
  • 93 posts
  • Sexo:Masculino

Posted 27/04/2009, 07:09

Passe o array por referência.

checkwhattodo($eventteam, $n, &$eventos);
var_dump ($eventos);

Note o simbolo "&" antes do array na chamada à função.

Espero ter ajudado.

#3 awls99

awls99

    Novato no fórum

  • Usuários
  • 2 posts
  • Sexo:Não informado

Posted 27/04/2009, 07:20

Passe o array por referência.

checkwhattodo($eventteam, $n, &$eventos);
var_dump ($eventos);

Note o simbolo "&" antes do array na chamada à função.

Espero ter ajudado.


Obrigado pela resposta rapida, fiz isso e resultou, mas levei com um warning agora

Warning: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of checkwhattodo(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\fp\app\manager\eventos.php on line 58


Quando passar isto para o servidor live que vai ter os avisos de erro desligados suponho que vai funcionar bem, mas vou por no google a ver se meto mais "bonito" ;)

Mais uma vez obrigado.

EDIT:

Uma pesquisa rapida no google descobri que sou mesmo noob nestas coisas e que o & deve ser usado na declaração da fução e não na chamada, ou seja, a solução correcta para o meu problema era mudar a declaração da função para:
function checkwhattodo($coiso, $n, &$array){}
tirei a info desta fonte e por outras referencias que encontrei penso que usar o & na chamada da função podera não ser suportado em versões futuras do php.
Mas não teria chegado la sem o CMAC, obrigado.

Edição feita por: awls99, 27/04/2009, 07:32.


#4 CMAC

CMAC

    Normal

  • Usuários
  • 93 posts
  • Sexo:Masculino

Posted 27/04/2009, 09:20

Pois, realmente confundi com a forma do C. Mas valeu pelo feedback.

#5 '' sem.Ponto

'' sem.Ponto

    Super Veterano

  • Ex-Admins
  • 2098 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte

Posted 27/04/2009, 12:11

Quando você quer trabalhar com um array que está fora da função, recomendo que acesse esse array com $GLOBALS.
att,
Muller Dias
ex-administrador Fórum WMO




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq