Como utilizar dois arrays para fazer uma consulta no banco?

Estou utilizando a API do Google, a Cloud Vision, para analisar uma imagem e me retornar através das Labels, qual Marca/Modelo de um carro, por exemplo.

Utilizando a imagem informada abaixo, tenho os seguintes retornos: [car, land vehicle, vehicle, motor vehicle, bmw, personal luxury car, bmw x6, sport utility vehicle, luxury vehicle, mid size car, automotive design, crossover suv, bmw concept x6 activehybrid, vehicle registration plate, bumper, family car, automotive exterior, executive car, compact car, bmw x3]

Primeiro utilizo as labels retornadas para buscar qual a Marca, nesse exemplo seria BMW.

$marcaUnica = []; // Array para comparação de labels, evitando nomes duplicados.
foreach ($nomes as $nome) { // Percorrendo todas as labels retornadas.
    $partes = explode(" ", $nome); // Separando nomes composto. EX: bmw x6
    foreach ($partes as $parte){ // Percorrendo as labels separadas.
        if(in_array($parte, $marcaUnica)){ // Verificando se a label existe no Array.
                  /* Caso exista não faz nada */
        }else{
            $marcaUnica[] = $parte; // Se não existir adiciona
            $retornoMarca[] = $this->m_consulta->marca($parte); //Faz uma busca no banco de dados com todas as labels, retornando apenas a label que existir no banco cadastrada como uma marca de carro. Nesse exemplo a unica marca e BMW.
        }
    }

}

Depois faço a mesma consulta, só que agora buscando pelos modelos, nesse exemplo, teria os modelos X3 e X6.

Ficando assim com dois arrays.

array(1) { [0]=> string(3) "BMW" }

array(2) { [0]=> string(2) "X3" [1]=> string(2) "X6" }

Minha primeira duvida é, como pegar esses arrays e passar como parâmetro para o Model, retornando o resultado da pesquisa na view?

Segunda duvida, como tratar os casos de em que um dos arrays ou ambos fique nulo(caso o retorno da API não traga nome de marca ou modelo).

Espero que a minha duvida tenha ficado clara, qualquer duvida no código só me perguntar, desde já agradeço a atenção de todos.

Imagem utilizada, uma BMW X6

O php possui um array associativo, como uma espécie de mapa…

$marcas = [];
foreach ($nomes as $nome) {
    $partes = explode(" ", $nome);
    foreach ($partes as $parte) {
        $marcas[$parte] = $parte; // evita duplicidade
    }
}
var_dump($marcas);

Os itens que se repetirem irão ter apenas uma chave, depois para buscar os modelos você pode usar o IN no sql…

$marcas = implode('\',\'', $marcas);
"SELECT... FROM. ... WHERE... marca IN ('$marcas')";

Algo nesse sentido, assim nem precisa usar if com in_array (com o tempo a performance será afetada dependendo do tamanho do array pra percorrer), não precisa ter dois arrays e no SQL passa apenas um parâmetro e busca tudo de uma só vez ao invés de trazer modelos para cada marca separadamente…

Ref. a duplicidade de palavras o código funcionou perfeitamente, obrigado.

Sobre a consulta, passando as labels no IN como você demostrou, vou ter dois registros retornados: X3 e X6. Cada modelo possui mais de uma versão, e eu gostaria de exibi-los em listas separadamente, e possível?
Atualmente estou pegando o retorno em uma variavel e fazendo o Foreach nela.

$versoes = $this->m_teste->consulta($modelos, $marca);

foreach ($versoes->result() as $versao) {
   echo($versao->nome_versao);
   echo($versao->ano_versao);
}

isto faz com que tudo fique na mesma lista

Vai depender de como as tabelas se relacionam, eu tinha te proposto o IN para listar todos os modelos (incluindo suas versões nesse caso) pelas marcas informadas…

Se para cada modelo você tem uma tabela separada com as versões, você precisará usar inner join …

O ideal como tentei te mostrar é ir na base de dados o mínimo possível, por isso uma query bem montada que te traga tudo de uma vez é sempre o recomendado…

Sim, já estou fazendo a consulta com join nas tabelas marcas e versões.
No caso preciso saber a marca primeiro, pois existem modelos com mesmo nome, então ja trago apenas os modelos da marca que quero.
Mas com o que já me passou me ajudou muito, a partir daqui consigo me virar.
Muito Obrigado.

1 curtida