[ GuTo ] 0 Denunciar post Postado Setembro 14, 2010 Boa tarde, Dêem uma olhada no código abaixo. Criei uma classe Pessoa na qual quero armazenar o(s) telefone(s) de uma pessoa. Caso 1: a pessoa pode ter apenas 1 número de telefone. Caso 2: a pessoa pode ter MAIS de 1 número de telefone, pode ter vários. Quero poder passar no parâmetro do meu método setTelefone($value): - uma string como "(11) 1111-1111" - ou também um array como "array('(22) 2222-2222', '(22) 3333-3333')" Quando passo um array, não estou conseguindo guardar os valores, pois dá este erro: Notice: Array to string conversion in C:\Inetpub\wwwroot\propriedade-array.php on line 28 public function setTelefone($Telefone) { if (is_array($Telefone)) $this->$Telefone = $Telefone; # <----------------- # Como resolver? // like array else $this->Telefone = $Telefone; # aqui funciona // like string } Para ver o código rodando, acesse o link http://antonioaugusto.com.br/testes/propriedade-array.php. Para ver o código fonte: <? function depurar($var, $continue = true) { echo '<pre>'; print_r($var); echo '</pre>'; if(!$continue) exit(); } class Pessoa { # Quero armazenar sempre um array aqui private $Telefone = array(); # Quero sempre retornar um array aqui, mesmo quando tiver apenas 1 item. public function getTelefone() { return $this->Telefone; } public function setTelefone($Telefone) { if (is_array($Telefone)) { echo '<p style="color:red">Veio como array</p>'; # Se vier um array, tudo ok. # ERRO NESTA LINHA 28 - ABAIXO $this->$Telefone = $Telefone; # <----------------- # Como resolver? # ERRO NESTA LINHA 28 - ACIMA } else { echo '<p style="color:green">Veio como string</p>'; # Se vier uma string, transformar em array. $this->Telefone = array($Telefone); } } } # TESTE COM STRING - INICIO echo '<h2>TESTE COM STRING - INICIO - STATUS = <span style="color:green">OK</span></h2>'; $fone1string = '(11) 9988-7766'; echo '<strong>Valor string que vou passar:</strong> '; depurar($fone1string); $p1 = new Pessoa(); $p1->setTelefone($fone1string); echo '<strong>Teste passando string retornou:</strong> '. $p1->getTelefone() .'<br /><strong>print_r($p1->getTelefone()): </strong>'; depurar($p1->getTelefone()); # TESTE COM STRING - FIM echo "<hr />"; # TESTE COM ARRAY - INICIO echo '<h2>TESTE COM ARRAY - INICIO - STATUS = <span style="color:red">COM PROBLEMA</span></h2>'; $fone2array = array('(22) 1111-1111', '(22) 2222-2222'); echo '<strong>Valor array que vou passar:</strong> '; depurar($fone2array); $p2 = new Pessoa(); $p2->setTelefone($fone2array); echo '<strong>Teste passando array retornou:</strong> '. $p2->getTelefone() .'<br /><strong>print_r($p2->getTelefone()): </strong>'; depurar($p2->getTelefone()); echo '<strong style="color:red; border:2px dashed darkred; padding:5px;">Aqui acima meu retorno deveria ser um array com posicoes.</strong>'; # TESTE COM ARRAY - FIM ?> Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Setembro 14, 2010 if (is_array($Telefone)) $this->Telefone[] = $Telefone; Compartilhar este post Link para o post Compartilhar em outros sites
[ GuTo ] 0 Denunciar post Postado Setembro 14, 2010 Opa, desculpe não comentar antes, mas isso já tentei antes e não funciona: Fatal error: Cannot use [] for reading in C:\Inetpub\wwwroot\propriedade-array.php on line 28 Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Setembro 14, 2010 <?php class Pessoa { private $Telefone = array(); public function getTelefone() { return $this->Telefone; } public function setTelefone($Telefone) { if ( is_array($Telefone) ) { echo '<p style="color:red">Veio como array</p>'; $this->Telefone[] = $Telefone; } } } $pessoa = new Pessoa(); $arr = Array('(22) 2222-2222', '(11) 1111-1111'); $pessoa->setTelefone( $arr ); echo '<pre>'; var_dump( $pessoa->getTelefone() ); saída: Veio como array array(1) { [0]=> array(2) { [0]=> string(14) "(22) 2222-2222" [1]=> string(14) "(11) 1111-1111" } } oque você não pode fazer, é tentar imprimir o array com echo, como se ele fosse string echo '<strong>Teste passando array retornou:</strong> '. $p2->getTelefone() .'<br /> viu ? Compartilhar este post Link para o post Compartilhar em outros sites
[ GuTo ] 0 Denunciar post Postado Setembro 14, 2010 Repare no retorno do seu array. É um array com 1 elemento que é um array com 2 elementos. Veio como array array(1) { [0]=> array(2) { [0]=> string(14) "(22) 2222-2222" [1]=> string(14) "(11) 1111-1111" } } E deveria ser: Array ( [0] => (22) 1111-1111 [1] => (22) 2222-2222 ) Alguém sabe exatamente como resolver? Por favor testar antes de responder. Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Setembro 14, 2010 <_< cara.. vou nem falar nada sobre esse teu comentário. if ( is_array($Telefone) ) { echo '<p style="color:red">Veio como array</p>'; foreach( $Telefone AS $tel ) $this->Telefone[] = $tel; }saída: array(2) { [0]=> string(14) "(22) 2222-2222" [1]=> string(14) "(11) 1111-1111" } Compartilhar este post Link para o post Compartilhar em outros sites
[ GuTo ] 0 Denunciar post Postado Setembro 15, 2010 hehehe, mal aí o comentário. na hora eu tava sem comer a horas e um pouco anti-pático, hehehe. mto ácido lático na corrente sanguínea, hehehe. te agradeço pelo ajuda. usar o foreach é o jeito mesmo. para ver o resultado final, basta acessar o link: http://antonioaugusto.com.br/testes/propriedade-array.php o código final, graças a tua ajuda, ficou assim: <? function depurar($var, $continue = true) { echo '<pre>'. print_r($var, true) . '</pre>'; if(!$continue) exit(); } class Pessoa { # Quero armazenar sempre um array aqui private $Telefone; # Quero sempre retornar um array aqui, mesmo quando tiver apenas 1 item. public function getTelefone() { return $this->Telefone; } public function setTelefone($Telefone, $Add = true) { if ($Add) { if (is_array($Telefone)) foreach ($Telefone as $tel) $this->Telefone[] = $tel; else $this->Telefone[] = $Telefone; } else $this->Telefone = $Telefone; } } $p = new Pessoa(); echo '<div>'; echo "\n\t<h2>Adicionando valores</h2>"; echo "\n\t<h4>Passando string</h4>"; $fone = '(11) 1111-1111'; $p->setTelefone($fone); $fone = '(11) 2222-2222'; $p->setTelefone($fone); depurar($p->getTelefone()); echo "\n\t<h4>Passando array</h4>"; $fone = array('(22) 1111-1111', '(22) 2222-2222'); $p->setTelefone($fone); $fone = array('(22) 3333-3333', '(22) 4444-4444'); $p->setTelefone($fone); depurar($p->getTelefone()); echo '</div>'; echo '<div>'; echo "\n\t<h2>Sem adicionar valores</h2>"; echo "\n\t<h4>Passando string</h4>"; $fone = '(11) 1111-1111'; $p->setTelefone($fone, false); $fone = '(11) 2222-2222'; $p->setTelefone($fone, false); depurar($p->getTelefone()); echo "\n\t<h4>Passando array</h4>"; $fone = array('(22) 1111-1111', '(22) 2222-2222'); $p->setTelefone($fone, false); $fone = array('(22) 3333-3333', '(22) 4444-4444'); $p->setTelefone($fone, false); depurar($p->getTelefone()); echo '</div>'; ?> Compartilhar este post Link para o post Compartilhar em outros sites
ursolouco 0 Denunciar post Postado Setembro 15, 2010 Salve, Vi sua mensagem só agora no MSN, foi mal. Segue codigo abaixo: <?php function depurar($var, $continue = true) { printf('<pre>%s</pre>', print_r($var,true)); if(!$continue) { exit(); } } class Pessoa { private $telefone; public function __construct() { $this->telefone = array(); } public function setTelefone($telefone) { if(is_array($telefone)) { foreach($telefone as $numeroTelefone) { array_push($this->telefone, $numeroTelefone); } } else { array_push($this->telefone, $telefone); } } public function getTelefone() { return $this->telefone; } } $ursao = new Pessoa(); $ursao->setTelefone('(11) 8155 2010'); $ursao->setTelefone(array('(11) 8155 0000', '(11)7070 7070', '(11)6666 6969')); depurar($ursao->getTelefone()); Abraços Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Setembro 15, 2010 cara.. nesse caso: foreach($telefone as $numeroTelefone) { array_push($this->telefone, $numeroTelefone); } usa entao um array_merge() :lol: Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Setembro 15, 2010 Na verdade, você poderia trabalhar com recursão nesse método setTelefone(), algo assim: public function setTelefone( $telefone ) { if( is_array( $telefone ) ) { foreach( $telefone as $numeroTelefone ) { $this -> setTelefone($numeroTelefone); } } else { $this->telefone[] = $telefone; } } Se o parâmetro $telefone for um array, o próprio método será invocado novamente, mas com o valor da iteração foreach corrente. Se esse valor também for um array, a operação se repete até que ovalor não seja um array. Quando não mais for, cairá no else e apropriedade será populada. P.S.: Definir como array() uma propriedade não precisa ser no construtor. Pode fazer direto fora dele: private $telefone = array(); ;) Compartilhar este post Link para o post Compartilhar em outros sites
[ GuTo ] 0 Denunciar post Postado Setembro 16, 2010 A questão do array_merge me parece melhor dentre todas, é a que estava pensando inicialmente, mas algo não funcionava. Enfim... A questão da recursividade ficou bem bonita de se ver realmente, mas o array_merge fica melhor mesmo :) private $_Telefone = array(); # Quero sempre retornar um array aqui, mesmo quando tiver apenas 1 item. public function getTelefone() { return $this->_Telefone; } public function setTelefone($Telefone, $Add = true) { if ($Add) { # Se estiver adicionando if (is_array($Telefone)) # Se for array, une os arrays $this->_Telefone = array_merge($this->_Telefone, $Telefone); else # Se for string array_push($this->_Telefone, $Telefone); } else # Sempre seta um novo valor, seja string ou array $this->_Telefone = is_array($Telefone) ? $Telefone : array($Telefone); } Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Setembro 16, 2010 Bom, é a sua forma de pensar, eu já discordo. Para se ver qual a melhor maneira, um bom e extenso teste de performance seria necessário. Mas, em todo caso, você pode otimizar o trecho: if (is_array($Telefone)) # Se for array, une os arrays $this->_Telefone = array_merge($this->_Telefone, $Telefone); else # Se for string array_push($this->_Telefone, $Telefone); Para: $this->_Telefone = array_merge($this->_Telefone, (array) $Telefone); Assim, se apenas um valor for passado, como string, o cast forçado da variável $Telefone fará, em execução, isto: $Telefone = '1234-5678'; Se transformar em: $Telefone = array( '1234-5678' ); Sempre mesclando um array. ;) Daí evita-se um condicional adicional, melhorando pelo menos um pouco o tempo de excução. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites