Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde pessoal !
Sou novo aqui no forum, então se eu postar algo errado me perdoe.
Amigos, sou novo com php e estou tendo problemas em achar uma solução.
Tenho um array:
$arrayCarro = array(
array(
"Cor"=>$gol->getCor(),
"Marca"=>$gol->getMarca(),
"Modelo"=>$gol->getModelo(),
"Ano"=>$gol->getAno()
),
array(
"Cor"=>$fusca->getCor(),
"Marca"=>$fusca->getMarca(),
"Modelo"=>$fusca->getModelo(),
"Ano"=>$fusca->getAno()
),
array(
"Cor"=>$tg->getCor(),
"Marca"=>$tg->getMarca(),
"Modelo"=>$tg->getModelo(),
"Ano"=>$tg->getAno()
)
);
e eu passo ele para um objeto do tipo 'Corrida', até ai tudo bem. Porém eu tenho uma function chamada 'ultrapassagem' e não faço a menor ideia de como poderia, de fato, fazer essa "ultrapassagem".
Este é o 'index.php':
<?php
require 'classes/Carro.php';
require 'classes/Corrida.php';
$gol = new Carro();
$fusca = new Carro();
$tg = new Carro();
$gol->setCor("Rosa");
$gol->setMarca("Wolks");
$gol->setAno(2018);
$gol->setModelo("Sedan");
$fusca->setCor("Azul");
$fusca->setMarca("Wolks");
$fusca->setAno(2018);
$fusca->setModelo("4X4");
$tg->setCor("vermelho");
$tg->setMarca("TG sedan");
$tg->setAno(2098);
$tg->setModelo("Flat");
$arrayCarro = array(
array(
"Cor"=>$gol->getCor(),
"Marca"=>$gol->getMarca(),
"Modelo"=>$gol->getModelo(),
"Ano"=>$gol->getAno()
),
array(
"Cor"=>$fusca->getCor(),
"Marca"=>$fusca->getMarca(),
"Modelo"=>$fusca->getModelo(),
"Ano"=>$fusca->getAno()
),
array(
"Cor"=>$tg->getCor(),
"Marca"=>$tg->getMarca(),
"Modelo"=>$tg->getModelo(),
"Ano"=>$tg->getAno()
)
);
$corrida = new Corrida($arrayCarro);
$corrida->posicaoCarro();
Esta é a Classe Corrida:
<?php private $arrayCarros;
public function __construct($arrayCarros)
{
$this->arrayCarros = $arrayCarros;
if(count($arrayCarros) > 0)
{
echo 'A corrida pode começar pois existe mais de um carro !'.PHP_EOL;
} else {
echo 'A corrida não pode começar pois existe apenas um carro :('.PHP_EOL;
exit;
}
}
public function iniciarCorrida()
{
echo 'Começando a corrida ...'.PHP_EOL;
echo '1, 2, 3 e JÁ!!.' .PHP_EOL;
echo '- A corrida começou ! Confira a posição inicial de cada carro: '.PHP_EOL;
echo PHP_EOL;
$this->posicaoCarro();
}
public function ultrapassagem()
{
/*Aqui eu tentei fazer algo, porem ele apenas retira o último elemento do array
e o avança para direita, foi o mais próximo que consegui de uma 'Ultrapassagem' */
$quantidadeCarros = count($this->arrayCarros);
$auxiliar = $this->arrayCarros[$quantidadeCarros - 1];
for ($i = $quantidadeCarros -1; $i > 0 ; $i--) {
$this->arrayCarros[$i] = $this->arrayCarros[$i -1];
}
$this->arrayCarros[0] = $auxiliar;
echo 'Aconteceu uma ultrapassagem'.PHP_EOL;
print_r($this->arrayCarros);
}
//Apenas uma função para 'melhorar' a exibição dos arrays.
public function posicaoCarro()
{
$i = 1;
foreach ($this->arrayCarros as $key => $value){
echo 'Posição ['. $i++."] => ";
print_r("Marca: " . $value['Marca'] . ", ");
print_r("Modelo: " . $value['Modelo'] . ", ");
print_r("Ano: " . $value['Ano'] . " ");
print_r("Cor: " . $value['Cor'] . " " .PHP_EOL);
echo PHP_EOL;
}
}
**OBS: Existem N carros.**
**Um carro só pode passar o carro que esta na sua frente, por ex: Carro[1] pode ultrapassar o Carro[0], porém o Carro [2] não pode ultrapassar o Carro[0], apenas o Carro[1]. Após a ultrapassagem a lista dos carros deve ser reordenada.**
Alguém poderia me ajudar ?
Desde já agradeço !>
Em 03/09/2018 at 08:55, Gabriel Heming disse:
Olá, pode nos postar o seu cenário completo? O objeto Corrida, aonde ele fica armazenado (se é apenas em um array normal), etc...
Prontinho, perdão! xD
Eu recomendaria criar um estrutura própria baseada em Data Structure.
De qualquer forma, usando apenas o que já existe, pode-se usar a Data Structure Vector ou Deque. Basicamente, elas são sequencias que podem encolher/aumentar conforme a necessidade (a Deque leva vantagem nos métodos shift e unshif, que no seu caso pode ser usado em apenas um momento). O diferencial nelas serão os métodos insert e find, para alterar a posição entre eles.
$gol->setCor("Rosa");
$gol->setMarca("Wolks");
$gol->setAno(2018);
$gol->setModelo("Sedan");
$fusca->setCor("Azul");
$fusca->setMarca("Wolks");
$fusca->setAno(2018);
$fusca->setModelo("4X4");
$tg->setCor("vermelho");
$tg->setMarca("TG sedan");
$tg->setAno(2098);
$tg->setModelo("Flat");
//Insira diretamente os objetos na lista
// a posição deles assumida é
// 1 - Gol
// 2 - Fusca
// 3 - TG
$list = new \Ds\Deque([$gol , $fusca , $tg]);
Ultrapassagem:
// suponha-se que o tg ultrapasse o fusca
$position = $list->find($tg);
//valida se localizou o veículo
if ($position === false)
{
// não esperamos esse erro, mas, se ocorrer, já sabe...
throw new \UnexpectedValueException("Veículo não localizado");
}
if ($position === 0) throw new \InvalidArgumentException ("Veículo já é o primeiro colocado");
}
// Método Ds\Deque::remove() remove o valor e retorna ele.
// O método Ds\Deque::insert() insere o valor na posição indicada, rearranjando a sequencia.
// Posição é sempre n - 1 (ou seja, a primeira é zero).
$list->insert($position - 1 , $list->remove($positon));
O interessante é que você não precisa dizer quem ele está ultrapassando, apenas dizer "qual carro" ultrapassou. O resto é tratado de forma uniforme.
Caso você queria que cada carro guarde a sua própria posição, pode usar o método [Ds\Deque::apply](https://secure.php.net/manual/en/ds-deque.apply.php) que aplica uma função em todos os elementos da sequencia.
Se quiser ler um pouco mais sobre Data Structures, o seguinte link é do criador da biblioteca: [https://medium.com/@rtheunissen/efficient-data-structures-for-php-7-9dda7af674cd](https://medium.com/@rtheunissen/efficient-data-structures-for-php-7-9dda7af674cd)
Olá, pode nos postar o seu cenário completo? O objeto Corrida, aonde ele fica armazenado (se é apenas em um array normal), etc...