
neto.joaobatista
Membros-
Total de itens
116 -
Registro em
-
Última visita
Tudo que neto.joaobatista postou
-
Certo, você recebe alguma mensagem de erro ?
-
(Resolvido) Problemas na hora de enviar formulário automaticamente
pergunta respondeu ao Pa3cK de neto.joaobatista em PHP
Amigão, você não precisa fazer isso... Uma vez que você já recebeu os dados de um formulário você pode fazer tudo de uma vez: $username = $_POST["usuario"]; $password = $_POST["senha"]; include( "painel_pecas_user.php" ); //Esse kara já consegue fazer o que ele precisa sem precisar simular um POST para ele []'s J. Neto -
(Resolvido) Inserir valores através de 2 arrays
pergunta respondeu ao Jefferson Fernandes de neto.joaobatista em PHP
Tenta assim: if ( isset( $_POST[ "nota" ] ) && isset( $_POST[ "id_aluno" ] ) ){ if ( ( $total = count( ( $nota = $_POST[ "nota" ] ) ) ) == count( ( $id_aluno = $_POST[ "id_aluno" ] ) ) ){ $sql = ""; for ( $i = 0; $i < $total; $i++ ){ $sql .= sprintf( "%s( %s , '%s' )" , empty( $sql ) ? "" : ", " , $id_aluno[ $i ] , $nota[ $i ] ); } $sql = sprintf( "INSERT INTO notas_aluno ( id_aluno, nota) VALUES %s" , $sql ); include( "SQL.php" ); } } []'s J. Neto -
Questões: Pelo IP da maquina servidora não está funcionando ? Você está utilizando um usuário com permissões para acesso remoto ? A maquina servidora tem algum firewall instalado ?
-
Bom amigo, como seu ambiente é Windows você pode tentar as bibliotecas COM: $word = new COM("word.application"); []'s J. Neto
-
Bom amigo, fiz um teste aqui e realmente ficou mais complicado que deveria, porém acho que se você fizer: 1. Envie seus dados para o Flash no formato XML: <dados> <texto>um <a href="event:1">texto</a> que está dentro do seu <a href="event:2">campo</a></texto> <links> <link id="id1" rel="primeiro link" target="self" /> <link id="id2" rel="segundo link" target="_blank" /> </links> </dados> O primeiro nó do seu XML é o texto, nele você coloca o que irá aparecer no seu TextField. Logo abaixo do seu nó texto você tem um nó chamado links e dentro dele uma referência para cada link do seu nó texto. Ai você irá trocar todos os hrefs dos seus links por: <a href="event:1">link 1</a> <a href="event:2">link 2</a> ... <a href="event:1000">link 1000</a> E para cada event:1, event:2, ..., event:N você terá um link no nó links que irá conter os dados que você precisa. Para fazer isso no AS 3 você usa o event:X, porém é possível obter o mesmo resultado no AS com asfunction. O exemplo abaixo foi feito utilizando o AS3 por que como não uso Windows não tenho o Flash aqui para testar... package { import flash.events.TextEvent; import flash.display.Sprite; import flash.text.TextField; public class Teste extends Sprite { /** * O campo que conterá seu texto */ private var seucampo:TextField; /** * Um outro campo só para você ver o resultado */ private var outrocampo:TextField; /** * O XML que você irá carregar, nesse exemplo eu usei um XML aqui dentro mesmo */ private var dados:XML; /** * Constroi o teste */ public function Teste(){ this.seucampo = new TextField(); this.seucampo.width = 200; this.seucampo.height = 200; this.seucampo.border = true; // Adicionamos um listener para que quando alguém clicar em um link chamar o método clicado this.seucampo.addEventListener( TextEvent.LINK, clicado ); this.outrocampo = new TextField(); this.outrocampo.y = 202; this.outrocampo.width = 200; this.outrocampo.height = 200; this.outrocampo.border = true; this.pegaXML(); this.escreveCampo(); this.addChild( this.seucampo ); this.addChild( this.outrocampo ); } /** * Pega o XML do servidor, nesse exemplo eu usei um XML escrito aqui mesmo */ public function pegaXML():void { this.dados = <dados> <texto>um <a href="event:1">texto</a> que está dentro do seu <a href="event:2">campo</a></texto> <links> <link id="id1" rel="primeiro link" target="self" /> <link id="id2" rel="segundo link" target="_blank" /> </links> </dados> } /** * Aqui pegamos o XML e jogamos o nó texto para o seucampo */ public function escreveCampo():void { this.seucampo.htmlText = this.dados.texto.toXMLString(); } /** * Cada vez que alguém clicar em um link um evento é disparado e esse método é chamado */ public function clicado( e:TextEvent ):void { var id:String = "id" + e.text; var rel:String = dados.links.link.( @id == id ).@rel.toXMLString(); var target:String = dados.links.link.( @id == id ).@target.toXMLString(); outrocampo.text = "link: " + e.text + "\nrel: " + rel + "\ntarget: " + target; } } } PS: Já faz bastante tempo que não desenvolvo utilizando AS e nem tenho mais Flash na minha máquina (nem é possível). O pessoal do ActionScript poderá te ajudar melhor quanto ao event:qqrcoisa ou o asfunction:suafuncao,parametro. []'s J. Neto
-
Amigo, essa questão de remoto/local é só uma questão de localização física das maquinas, e isso é relevante apenas para nós, mortais. O PHP usa um IP ou um nóme para conectar à sua base MySQL, portanto basta que sua máquina "local" tenha um IP fixo ou um nome válido que o PHP não se importará em conectar, mesmo não estando no mesmo servidor (e muitas vezes não está mesmo). []'s J. Neto
-
Bom amigo, fiz um teste aqui e realmente ficou mais complicado que deveria, porém acho que se você fizer: 1. Envie seus dados para o Flash no formato XML: <dados> <texto>um <a href="event:1">texto</a> que está dentro do seu <a href="event:2">campo</a></texto> <links> <link id="id1" rel="primeiro link" target="self" /> <link id="id2" rel="segundo link" target="_blank" /> </links> </dados> O primeiro nó do seu XML é o texto, nele você coloca o que irá aparecer no seu TextField. Logo abaixo do seu nó texto você tem um nó chamado links e dentro dele uma referência para cada link do seu nó texto. Ai você irá trocar todos os hrefs dos seus links por: <a href="event:1">link 1</a> <a href="event:2">link 2</a> ... <a href="event:1000">link 1000</a> E para cada event:1, event:2, ..., event:N você terá um link no nó links que irá conter os dados que você precisa. Para fazer isso no AS 3 você usa o event:X, porém é possível obter o mesmo resultado no AS com asfunction. O exemplo abaixo foi feito utilizando o AS3 por que como não uso Windows não tenho o Flash aqui para testar... package { import flash.events.TextEvent; import flash.display.Sprite; import flash.text.TextField; public class Teste extends Sprite { /** * O campo que conterá seu texto */ private var seucampo:TextField; /** * Um outro campo só para você ver o resultado */ private var outrocampo:TextField; /** * O XML que você irá carregar, nesse exemplo eu usei um XML aqui dentro mesmo */ private var dados:XML; /** * Constroi o teste */ public function Teste(){ this.seucampo = new TextField(); this.seucampo.width = 200; this.seucampo.height = 200; this.seucampo.border = true; // Adicionamos um listener para que quando alguém clicar em um link chamar o método clicado this.seucampo.addEventListener( TextEvent.LINK, clicado ); this.outrocampo = new TextField(); this.outrocampo.y = 202; this.outrocampo.width = 200; this.outrocampo.height = 200; this.outrocampo.border = true; this.pegaXML(); this.escreveCampo(); this.addChild( this.seucampo ); this.addChild( this.outrocampo ); } /** * Pega o XML do servidor, nesse exemplo eu usei um XML escrito aqui mesmo */ public function pegaXML():void { this.dados = <dados> <texto>um <a href="event:1">texto</a> que está dentro do seu <a href="event:2">campo</a></texto> <links> <link id="id1" rel="primeiro link" target="self" /> <link id="id2" rel="segundo link" target="_blank" /> </links> </dados> } /** * Aqui pegamos o XML e jogamos o nó texto para o seucampo */ public function escreveCampo():void { this.seucampo.htmlText = this.dados.texto.toXMLString(); } /** * Cada vez que alguém clicar em um link um evento é disparado e esse método é chamado */ public function clicado( e:TextEvent ):void { var id:String = "id" + e.text; var rel:String = dados.links.link.( @id == id ).@rel.toXMLString(); var target:String = dados.links.link.( @id == id ).@target.toXMLString(); outrocampo.text = "link: " + e.text + "\nrel: " + rel + "\ntarget: " + target; } } } []'s J. Neto
-
Bom, de fato o TextField.htmlText irá entender apenas os atributos comuns. Mas com um XML você conseguiria ter a listagem de todos as tags com todos os atributos, ai com getCharIndexAtPoint você consegue o caracter pela a posição que o kara clicou, faz a varredura até encontrar o primeiro espaço em branco antes e até encontrar o próximo espaço em branco depois, faz a seleção e compara com os seus links, encontrando o link na lista do XML você dispara a ação. []'s J. Neto
-
Como você está lendo essa linha no Flash ? Não seria mais fácil você enviar um XML para o Flash ?? []'s J. Neto
-
Duas tabelas - Como faço para inserir e atualizar ao mesmo tempo?
pergunta respondeu ao Tchello de neto.joaobatista em MySQL
Você pode usar um "trigger"... Como você só passou duas tabelas e nenhuma relação entre elas eu assumi que você quer atualizar a linha da tabela2 que contém o id inserido na tabela1, porém você pode modificar a parte do UPDATE para atender suas necessidades. create trigger atualiza AFTER INSERT ON tabela1 for each row update tabela2 set `telefone`=NEW.telefone WHERE tabela2.id = NEW.id Explicando: Cria o "gatilho" "atualiza" que será puxado logo após um insert ocorrer na tabela1 O gatilho percorrerá cada linha inserida e irá efetuar um UPDATE na tabela2 atualizando a coluna "telefone" com o valor do telefone da nova linha da tabela1 quando o id da tabela2 for igual ao id da nova linha Abraços... J. Neto -
Eu imaginei mesmo que o ganho para o status seria pequeno, mesmo porque o seu vilão de verdade é o código de barras. Porém, se for possível reduzir tanto no "status" quanto no código de barras então acredito que o ganho será bem maior Quando você tiver os dados, poste no fórum, fiquei curioso quanto ao desempenho... Abraços... J. Neto
-
Tem como proteger um diretório com o PHP
pergunta respondeu ao Matheus Matos de neto.joaobatista em PHP
Bom amigão, Você conseguirá fazer se seu projeto estiver em um servidor apache. Para isso você precisará criar um arquivo chamado .htaccess, No seu .htaccess: RewriteEngine on RewriteBase / RewriteRule ^(.*)$ index.php?querystring=$0 [QSA] O código acima fará com que o apache pegue qualquer coisa depois da base e jogue na variável querystring. Feito isso é só usar a autenticação HTTP para fazer o resto, aqui vai um exemplo: /** * Definindo locale e hora para Brasil */ setlocale( LC_ALL , 'pt_br' ); date_default_timezone_set( "America/Sao_Paulo" ); /** * Demonstração de sistema de autenticação HTTP utilizando PHP + Apache */ abstract class Main { /** * Mensagem que aparecerá quando não se identificar ou digitar um login e senha inválido */ const ACESSO_NEGADO = "Acesso negado"; /** * Mensagem que aparecerá para solicitar o login e senha */ const INDENTIFIQUE = "Para acessar, identifique-se"; /** * Mensagem para o erro HTTP 404 */ const ARQUIVO_NAO_ENCONTRADO = "O arquivo solicitado não existe"; /** * Mensagem que aparecerá se o usuário tentar recuperar um arquivo proibido: HTTP 403 */ const PROIBIDO = "Acesso negado ao arquivo solicitado"; /** * Mensagem que aparecerá se o usuário tentar listar o conteúdo da pasta */ const LISTAGEM_PROIBIDA = "A listagem desse diretório é proibida"; /** * O nome do usuário * @var string */ static private $user; /** * A senha do usuário * @var string */ static private $pswd; /** * Inicia a demonstração de autenticação via HTTP */ static public function start(){ /** * Verificamos se o usuário digitou seu login e senha, se não tiver digitado abrimos o diálogo * para que ele possa digitar */ if ( !isset( $_SERVER[ "PHP_AUTH_USER" ] ) ){ self::authentication(); } else { /** * Recuperamos os dados digitados pelo usuário, se forem válidos então continuamos. */ self::$user = $_SERVER[ "PHP_AUTH_USER" ]; self::$pswd = $_SERVER[ "PHP_AUTH_PW" ]; if ( self::validate() ){ self::go(); } else { /** * Os dados são inválidos, solicitamos login e senha novamente */ self::authentication(); } } } /** * Verificamos se o usuário está solicitando um arquivo ou uma pasta. * Se o arquivo que o usuário estiver solicitando existir então devolvemos o arquivo para o usuário. * Se o usuário estiver solicitando uma pasta, um erro HTTP 403 será retornado informando que a listagem de pastas é proibido */ static private function go(){ if ( isset( $_REQUEST[ "querystring" ] ) ){ $file = $_REQUEST[ "querystring" ]; if ( !empty( $file ) && !is_dir( $file ) ){ if ( file_exists( $file ) ){ if ( !self::getFile( $file ) ){ header( "HTTP/1.0 403 Forbidden" ); printf( self::PROIBIDO ); } } else { header( "HTTP/1.0 404 Not Found" ); printf( self::ARQUIVO_NAO_ENCONTRADO ); } } else { header( "HTTP/1.0 403 Forbidden" ); printf( self::LISTAGEM_PROIBIDA ); } } } /** * Verifica se o arquivo solicitado pode ser recuperado, somente .jpg, .png e .gif são permitidos, para que outros * arquivos possam ser exibidos basta acrescentar um novo na lista * * @param string $file O arquivo que está sendo solicitado * @return boolean TRUE se o arquivo estiver na lista, FALSE se não. */ static private function getFile( $file ){ $ret = false; $parts = pathinfo( $file ); switch ( $parts[ "extension" ] ){ case "jpg": case "png": case "gif": $ret = true; header( "HTTP/1.0 200 OK" ); header( sprintf( "Content-Type: image/%s" , $parts[ "extension" ] ) ); header( sprintf( "Content-Length: %d" , filesize( $file ) ) ); header( sprintf( "Date: %s" , gmstrftime( "%a, %d %b %Y %H:%M:%S %Z" , time() ) ) ); header( sprintf( "Last-Modified: %s" , gmstrftime( "%a, %d %b %Y %H:%M:%S %Z" , filemtime( $file ) ) ) ); readfile( $file ); break; } return( $ret ); } /** * Exibe o diálogo HTTP para autenticação */ static private function authentication(){ header( sprintf( 'WWW-Authenticate: Basic realm="%s"' , self::INDENTIFIQUE ) ); self::unauthorized( self::ACESSO_NEGADO ); } /** * Exibe o erro HTTP 401 para acesso negado */ static private function unauthorized(){ header( 'HTTP/1.0 401 Unauthorized' ); printf( self::ACESSO_NEGADO ); } /** * Valida os dados do usuário, aqui a validação pode ser de qualquer forma, inclusive recuperando os * dados em um banco de dados * @return boolean TRUE se os dados do usuário forem válidos */ static private function validate(){ $ret = false; if ( ( self::$user == "teste" ) && ( self::$pswd == "senha" ) ){ $ret = true; } return( $ret ); } } Main::start(); Coloque o código acima em um arquivo index.php na pasta que você quer proteger e na mesma pasta você coloca o .htaccess []'s J. Neto -
Eu faria assim: public function listar(){ $ret = false; try { $stmt = $this->conexao->query("SELECT * FROM produtos ORDER BY descricao"); $this->conexao = null; // Definimos o retorno aqui para que uma exceção disparada pelo PDO não nos confunda. $ret = $stmt; } catch ( PDOException $ex ){ throw new Exception( $ex->getMessage() , $ex->getCode() , $ex ); } return( $ret ); } try { if ( $obj->listar() !== false ){ printf( "Ok, retornamos um resultado\n" ); } } catch ( Exception $e ){ printf( "Erro[ %d ]: %s\n" , $e->getCode() , $e->getMessage() ); } []'s J. Neto
-
(Resolvido) visualizar imagem antes de gravá-la
pergunta respondeu ao Levi_gns de neto.joaobatista em PHP
Bom, você não pode utilizar move_uploaded_file para o passo 3 porque a foto já não está mais na pasta temporária de uploads do servidor, em vez disso ela está na sua pasta temporária. Para mover/renomear um arquivo você utiliza a função rename: bool rename ( string $oldname , string $newname [, resource $context ] ) No seu caso ficaria assim: rename( $temp , "fotos/" . $id_gerado ); []'s J. Neto -
(Resolvido) função para ler dois arquivos e criar um terceiro
pergunta respondeu ao Dioniton de neto.joaobatista em PHP
Abraços... ;) -
(Resolvido) visualizar imagem antes de gravá-la
pergunta respondeu ao Levi_gns de neto.joaobatista em PHP
O que você pode fazer é criar uma pasta chamada temp e mover o arquivo para essa pasta, ai quando o usuário confirmar que a foto está correta você move novamente da pasta temp para a pasta fotos. ;) -
(Resolvido) função para ler dois arquivos e criar um terceiro
pergunta respondeu ao Dioniton de neto.joaobatista em PHP
hehehe, falha minha... Bom o que está acontecendo é que eu não imaginei que arq1 e arq2 pudessem ficar tão grandes.... Se você utilizar uma @ na frente do preg_match você eliminará o Warning que está sendo gerado atualmente, porém você terá uma execução realmente MUITO lenta conforme o número de linhas começar a crescer. Talvez se mudarmos o ponto de vista em relação ao preg_match consigamos um resultado menos danoso: // Abrindo e lendo o arquivo arq1.txt $arq1 = fopen( "arq1.txt" , "r" ); $arq1str = ""; $arq1arr = array(); while ( ( $line = fgets( $arq1 ) ) ){ $arq1str .= $line; } // Abrindo e lendo o arquivo arq2.txt $arq2 = fopen( "arq2.txt" , "r" ); $arq2str = ""; $arq2arr = array(); while ( ( $line = fgets( $arq2 ) ) ){ $arq2str .= $line; } $arq1bool = preg_match_all( "/^.*$/m" , $arq1str , $arq1arr ); $arq2bool = preg_match_all( "/^.*$/m" , $arq2str , $arq2arr ); // Verificamos se o arq1.txt tem alguma linha if ( $arq1bool ) { $diff = array(); // Verificamos se encontramos alguma linha no arq2.txt, se não encontrarmos então a diferença é o próprio arq1.txt if ( $arq2bool ) { // Comparando as diferenças $diff = array_diff( $arq1arr[ 0 ] , $arq2arr[ 0 ] ); } else { $diff = $arq1arr[ 0 ]; } // Verificando se existem itens no arq1.txt que não estão no arq2.txt if ( count( $diff ) ) { // Existem itens no arq1.txt que não estão no arq2.txt então vamos gravá-las no arq3.txt $arq3 = fopen( "arq3.txt" , "w+" ); $arq3_content = implode( "\r\n" , $diff ); // Fechando o arq3.txt fwrite( $arq3 , $arq3_content , strlen( $arq3_content ) ); fclose( $arq3 ); } } // Fechando os arquivos fclose( $arq2 ); fclose( $arq1 ); Tenta ai e me da um toque... []'s J. Neto -
Tenta assim: if($fastuper=="Ligado"){ $cor="#00ff00"; }else{ $cor="#ff0000"; } echo "Status: <span style=\"color:$cor;\">$fastuper</span>";
-
(Resolvido) includes dentro de includes...
pergunta respondeu ao Marcos Beraldo de neto.joaobatista em PHP
Bom, não tinha visto sua resposta no fórum por isso enviei outra em PVT. Mas lamento profundamente que esse fórum seja "moderado" dessa forma. Por mim, pode considerar o tópico encerrado. Abraços, João Neto -
Bom, a sintaxe do PHP nesse caso da condicional é muito similar à do C: if ( lvalue == rvalue ){ //são iguais } else { //são diferentes } Assim: abstract class Color { const GREEN = "#00FF00"; const RED = "#FF0000"; } if ( $fastuper == "LIGADO" ){ $LIGADO = Color::GREEN; } else { $DESLIGADO = Color::RED; } Porém, se LIGADO e DESLIGADO não forem variáveis e sim constantes você faria assim: if ( $fastuper == "LIGADO" ){ define( "LIGADO" , Color::GREEN ); } else { define( "DESLIGADO" , Color::RED ); } Agora, se você utilizar apenas uma variável ou constante para definir a cor, você poderia fazer assim: abstract class Color { const GREEN = "#00FF00"; const RED = "#FF0000"; } $cor = $fastuper == "LIGADO" ? Color::GREEN : Color::RED; // ou como constante define( "COR" , $fastuper == "LIGADO" ? Color::GREEN : Color::RED ); []'s J. Neto
-
(Resolvido) includes dentro de includes...
pergunta respondeu ao Marcos Beraldo de neto.joaobatista em PHP
Será mesmo que é ? Alguém aqui já leu algum código realmente grande ? Gente, tenho uma classe A que utiliza uma classe B e C, a classe B utiliza uma classe D e E e a classe C uma classe F e G. Vocês estão me dizendo que eu devo incluir na classe A as classes: D e E (que fazem parte da B ) F e G (que fazem parte da C ) Sem contar é claro as classes B, C (que fazem parte da própria classe A ). Por que se for isso mesmo, então acho realmente que todo mundo enlouqueceu, hehehehe, fico imaginando um arquivo codificado assim, tipo. 1a linha: include... 2a linha : include... ... 576a linha: include... <? Aplicacao::getObj()->mostra_nome(); //Detalhe que a classe Aplicacao foi definida no include 3 ?> Uau, fico imaginando o quão elegante é um código assim... Abraços a todos. -
(Resolvido) includes dentro de includes...
pergunta respondeu ao Marcos Beraldo de neto.joaobatista em PHP
Meu amigo: 1. Ou você é completamente LOUCO ou 2. Você NUNCA desenvolveu uma aplicação maior que dois ou três arquivos ou 3. EU preciso URGENTEMENTE voltar para a faculdade. Lamento pelo tom, moderação, mas acho que a resposta do Marcus Nunes ẽ completamente ridícula e posso enumerar uma centena de ocasiões onde incluir um arquivo e esse arquivo incluir outros arquivos que também incluem outros arquivos É NATURAL e muitas vezes reflete UMA BOA PRÁTICA DE PROGRAMAÇÃO. Bom Beraldo, existem várias formas de se fazer isso, algumas mais elegantes e outras mais fáceis e práticas, vou passar como exemplo uma mais prática e mais simples de implementar, porém você terá sempre que tomar cuidado com o uso pois você pode correr um risco de segurança se esse método for utilizado de forma errada: No seu arquivo validar_session.php (que está na raiz): include_once( sprintf( "%sseu_arquivo.php" , $_SERVER[ "DOCUMENT_ROOT" ] ) ); O código poderá não funcionar se você estiver desenvolvendo em um ambiente onde você tem um "localhost" e nesse servidor você tem várias pastas, uma para cada projeto. Nesse caso você pode utilizar uma verificação antes do include: if ( $_SERVER[ "SERVER_NAME"] == "localhost" ){ $nome_da_pasta_do_seu_projeto = "projeto"; include_once( sprintf( "%s%s/seu_arquivo.php" , $_SERVER[ "DOCUMENT_ROOT" ] , $nome_da_pasta_do_seu_projeto ) ); } else { include_once( sprintf( "%sseu_arquivo.php" , $_SERVER[ "DOCUMENT_ROOT" ] ) ); } Abraços Beraldo. PS: Marcus Nunes para garantir seu direito a réplica sem prejudicar o andamento do fórum, você pode escrever diretamente para o meu email: neto.joaobatista@gmail.com []'s J. Neto -
Bom amigo, você pode utilizar as funções nativas do PHP para fazer isso: array_filter: Irá criar um filtro utilizando uma função callback arsort: Irá ordernar sua matriz de forma reversa (O maior virá primeiro e o menor por último) Primeiro você cria a função callback para trabalhar com o array_filter: /** * Pontua os elementos de uma matriz segundo o número de ocorrências * <p> * Caso seja passado o parâmetro $valor então assumiremos que estamos atuando como callback e * retornaremos sempre FALSE, se nenhum parâmetro for passado então assumiremos que estamos atuando * standalone e retornaremos uma matriz com a lista de elementos já pontuada e ordenada * </p> * * @param mixed $valor O elemento da matriz * @return boolean|array */ function rank( $valor = null ){ static $lista = array(); $ret = false; // Usamos func_num_args aqui para evitar um comportamento inesperado caso algum elemento da matriz contenha NULL if ( func_num_args() ){ if ( $valor == NULL ) $valor = "NULL"; if ( !isset( $lista[ $valor ] ) ) $lista[ $valor ] = 1; else ++$lista[ $valor ]; } else { $ret = $lista; //Ordenamos a matriz de forma reversa para que o elemento que tiver maior quantidade seje o primeiro da lista arsort( $ret ); // Reiniciamos a matriz para que a função rank possa ser utilizada como callback novamente $lista = array(); } return( $ret ); } Depois de definido seu callback você pode trabalhar com sua matriz normalmente: $canal[]='Globo'; $canal[]='Globo'; $canal[]='Globo'; $canal[]='SBT'; $canal[]='Globo'; $canal[]='Globo'; $canal[]='Record'; $canal[]='Record'; $canal[]='SBT'; $canal[]='SBT'; $canal[]='SBT'; $canal[]='Record'; // Fazemos o filtro na matriz array_filter( $canal , "rank" ); // Chamamos a função rank agora sem ser como callback, para recuperar a lista: var_dump( rank() ); ?> O código acima irá produzir: array(3) { ["Globo"]=> int(5) ["SBT"]=> int(4) ["Record"]=> int(2) } []'s J. Neto
-
Bom amigão, em qualquer linguagem que trabalha com esses operadores o funcionamento é o seguinte: Os operadores de incremento e decremento podem ser de prefixo e de sufixo, os de prefixo têm prioridade na operação (ocorrem antes das outras operações): $a = 2; $b = 1; $c = ++$a + $b; var_dump( array( $a , $b , $c ) ); O código acima vai produzir: array(3) { [0]=> int(3) [1]=> int(1) [2]=> int(4) } Isso porque a prioridade foi dada ao operador de incremento de prefixo, ou seja: Defina a variável $c com o valor incrementado de $a somado ao valor de $b Porém os operadores de incremento de sufixo ocorrem depois da expressão ser interpretada: $a = 2; $b = 1; $c = $a++ + $b; var_dump( array( $a , $b , $c ) ); O código acima irá produzir: array(3) { [0]=> int(3) [1]=> int(1) [2]=> int(3) } Ou seja: Defina a variável $c com o valor da variável $a somado ao valor da variável $b, somente então incremente a variável $a Um exemplo legal é o próximo: $a = 2; $b = 1; $c = $a++ + $b - $a; var_dump( array( $a , $b , $c ) ); Você pode pensar: "Bom, se $a++ + $b resultou em 3 e $a vale 2 e $b vale 1, então $3 menos o valor de $a que é 2 resultará em 1" Porém, como a operação onde o operador de incremento de sufixo tem preferência já terminou então significa que o escopo da operação já é outro, no caso a definição da variável $c é: Defina a variável $c com o valor da soma entra $a e $b, incremente $a e então subtraia do total o novo valor de $a, em partes: $c = $a + $b; //2 + 1 => 3 $a = $a + 1; //2 + 1 => 3 $c = $c - $a; //3 - 3 => 0 array(3) { [0]=> int(3) [1]=> int(1) [2]=> int(0) } []'s J. Neto