Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Luis_Carlos

Fila com prioridades com SPLPriorityQueue

Recommended Posts

-Fiz um formulario com campos dinamicos, em que o usuario do sistema vai cadastrar os clientes e o script php dirá a ordem de atendimento,Minha intensão é que o script desse a ordem de atendimento 1º pela prioridade e 2º pela ordem de registro no formulario,mas sinceramente não econtrei nenhum exemplo na internet de como montar algo do genero,ou talvez nem dê sem um banco de dados.
Agradeço se puderem me ajudar.
segue o codigo:
<html>
<body>
<h2>Gerenciamento de fila com prioridade BANCO  S.A</h2>
<form name="form1" action="lista_banco.php" method="post">
quantidade de pessoas a serem atendidas <input type="number" name="quantidade" value=""> <input type="button" value="Alterar" onclick="altera()"><br/>
<div id="id2"></div>


<br> <input type="submit" value="Enviar"> </br>
</form>
<script>




function altera()
{	var conteudo = "";
	var contador = 0;
	while (contador < parseInt(form1.quantidade.value))
	{	conteudo = conteudo+'Nome do cliente '+(contador+1)+' <input type ="text" name="nome'+(contador+1)+'" value=""maxlength="50">  Tipo de atendimento  <select name="prioridades" form="form1"><option value="caixa">Caixa Atendimento Prioritário</option><option value="caixa_deposito">Caixa depósitos</option><option value="caixa_saque">Caixa Saque</option><option value="gerencia">Gerencia Atendimento Prioritário</option></select><option name="gerencia_geral"value="">Gerencia Geral</option> <br/>';
		contador = contador+1;
	}
	document.getElementById("id2").innerHTML = conteudo;
}

	


</script>




</body>
</html>

Agora o PHP

<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <?php


if (isset($_POST["enviar"])) { 
    $caixa = "Caixa Atendimento Prioritário ";

$caixa_deposito="Caixa Depósito";
$caixa_saque="Caixa Saque";
$gerencia="Gerencia Atendimento Prioritário";
$gerencia_geral="Gerencia Atendimento Geral"; 


$cliente_prioridade = new SplPriorityQueue;
$cliente_prioridade ->insert($caixa,10 );
$cliente_prioridade ->insert($caixa_deposito, 9);
$cliente_prioridade ->insert($caixa_saque, 8);
$cliente_prioridade ->insert($gerencia, 8);
$cliente_prioridade ->insert($gerencia_geral, 3); 



echo "<h2>Atendendo o cliente </h2>" ;
while ($cliente_prioridade ->valid()){
    echo "<br> A ordem de atendimento é   " .$cliente_prioridade ->extract($_POST["enviar"]);
                        }
                       
    
}
                       
 
     
?>
    
</html>

    </body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu uso não está de acordo com a proposta da SplPriorityQueue:

$cliente_prioridade = new SplPriorityQueue;
$cliente_prioridade ->insert($caixa,10 );
$cliente_prioridade ->insert($caixa_deposito, 9);
$cliente_prioridade ->insert($caixa_saque, 8);
$cliente_prioridade ->insert($gerencia, 8);
$cliente_prioridade ->insert($gerencia_geral, 3);

A SplPriorityQueue ordena a fila de espera conforme a prioridade, no seu exemplo você não iniciou uma fila de espera, você criou um apenas a lista de atendimentos com suas prioridades (de nada lhe servirá).

Um exemplo básico (baseado em um exemplo do manual):

<?php

$serviceList = [
    'caixa' => 10,
    'caixa_deposito' => 9,
    'caixa_saque' => 8,
    'gerencia' => 8,
    'gerencia_geral' => 3
]; 

$queueList = new SplPriorityQueue(); 
$queueList->insert('A' , $serviceList['gerencia_geral']);
$queueList->insert('B' , $serviceList['gerencia']);
$queueList->insert('C' , $serviceList['caixa']);
$queueList->insert('D' , $serviceList['caixa_saque']);
$queueList->insert('E' , $serviceList['caixa_deposito']);

echo "count -> ".$queueList->count(); 

//mode of extraction 
$queueList->setExtractFlags(SplPriorityQueue::EXTR_BOTH); 

foreach($queueList AS $row) { 
    print_r($row); 
} 

Saída:

count -> 5
Array ( [data] => C [priority] => 10 )
Array ( [data] => E [priority] => 9 )
Array ( [data] => D [priority] => 8 )
Array ( [data] => B [priority] => 8 )
Array ( [data] => A [priority] => 3 )


A fila foi ordenada conforme a sua prioridade. Mas nessa fila há um problema que é mencionado no manual:

Note: Multiple elements with the same priority will get dequeued in no particular order.


B veio antes que D, mas ambos possuem a mesma prioridade, ou seja, precisa-se de um novo modelo de priorização.

Esse modelo é mostrado no seguinte exemplo:
http://php.net/manual/en/splpriorityqueue.compare.php#93999

 

No exemplo acima linkado, foi criada uma especialização para resolver o problema. Eu irei utilizar uma forma mais simplista através de da fórmula matemática f(x) = 1/x (o X é o valor de entrada, o count da lista ).
Basicamente isso fará com que o menor valor seja o maior de todos. Utilizarei esse cálculo para critério de desempate, informando quem foi o primeiro entrar na fila de espera.

Bora remontar a lista:

$queueList = new SplPriorityQueue(); 
$queueList->insert('A' , array($serviceList['gerencia_geral'] , (1 / ($queueList->count() + 1))));
$queueList->insert('B' , array($serviceList['gerencia'] , (1 / ($queueList->count() + 1))));
$queueList->insert('C' , array($serviceList['caixa'] , (1 / ($queueList->count() + 1))));
$queueList->insert('D' , array($serviceList['caixa_saque'] , (1 / ($queueList->count() + 1))));
$queueList->insert('E' , array($serviceList['caixa_deposito'] , (1 / ($queueList->count() + 1))));

O +1 evita a divisão por zero. Adicionando um array para priorização, a prioridade principal é a posição zero, seguida da posição 1 (caso houver conflito na posição zero).

Saída:

count -> 5
Array ( [data] => C [priority] => Array ( [0] => 10 [1] => 0.33333333333333 ) )
Array ( [data] => E [priority] => Array ( [0] => 9 [1] => 0.2 ) )
Array ( [data] => B [priority] => Array ( [0] => 8 [1] => 0.5 ) )
Array ( [data] => D [priority] => Array ( [0] => 8 [1] => 0.25 ) )
Array ( [data] => A [priority] => Array ( [0] => 3 [1] => 1 ) )

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela resposta,ainda estou testando pois não consegui receber os dados do formulario que receberam a lista de clientes :/

Se ouder dar uma olhada agradeço :)

<!--FORMULARIO-->

<!DOCTYPE html>

    <meta charset="utf-8" >
    
<h2>Gerenciamento de fila com prioridade BANCO ETEC S.A</h2>
<head>
    <script>

function altera()
{	var conteudo = "";
	var contador = 0;
	while (contador < parseInt(form1.quantidade.value))
	{	conteudo = conteudo+'Nome do cliente '+(contador+1)+' <input type ="text" name="nome'+(contador+1)+'" \n\
value=""maxlength="50">  Tipo de atendimento    <select name="prioridades'+(contador+1)+' >\n\
<option value="gerencia_geral">Gerencia Geral</option>\n\
<option value="caixa">Caixa Atendimento Prioritário</option>\n\
<option value="caixa_deposito">Caixa depósitos</option>\n\
<option value="caixa_saque">Caixa Saque</option>\n\
<option value="gerencia">Gerencia Atendimento Prioritário</option></select> <br/>';
		contador = contador+1;
               
	}
	document.getElementById("id2").innerHTML = conteudo;
        
}
</script>
</head>
<body>
<form name="form1" method="post" action="lista_banco.php" >
quantidade de pessoas a serem atendidas <input type="number" name="quantidade" value=""> 
<input type="button" value="Alterar" onclick="altera()"><br/>
<div id="id2"></div>

<br> <input type="submit" value="Enviar"> </br>


</form>




</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Apesar de eu gostar e promover o uso da orientação à objetos e SPL. Sua necessidade é melhor suprida com o uso de um SGBD.

 

Digo isso por causa da estrutura de funcionamento do PHP. Resumidamente, não existe uma aplicação sempre rodando (como Java e C#) e somente um sessão é criada para cada requisição.

 

No PHP a aplicação é criada/iniciada a cada requisição. Dessa forma, sempre que quiser saber o próximo da fila de prioridade, você terá que criar toda a lista de prioridade novamente.

 

Não é benéfico criar toda uma lista (depende de quantas entradas você tem) só para retornar um resultado.

 

De qualquer forma, para criar a lista de prioridade no PHP, você precisa ter o registro salvo em algum lugar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade somente preciso mostrar a ordem em que formam inscritos os atendimentos conforme a prioridade, não vai importar a ordem em que forma inscritos, apenas devo mostrar os inscritos por grupos de prioridade...

exemplo:

Prioridade A= cliente 1,2,3,4

Prioridade B =cliente 1,2,3,4,5

Prioridade C=cliente x,y,z

 

Para essa necessidade não preciso de algo muito complexo,se puder continuar me ajudando com isso agradeço, não tenho muito conhecimento a ponto de usar java ou um BD

Grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.