2017-10-03 1 views
0

ObjectifRefactor tableau PHP regroupement et la cartographie

Je me demande s'il y a une meilleure façon de coder ce problème? Je voudrais refactoriser si possible.

Exigences:

  • Étant donné une liste des codes ACRISS véhicules (http://www.acriss.org/car-codes.asp), le groupe des véhicules en catégories en fonction de leurs caractères. Une voiture peut être regroupée en une ou plusieurs catégories. Exemple de LTAR: Puisque L est le premier caractère, il serait groupé en Luxe et puisque T est le second caractère, il serait également groupé en tant que Convertible.
  • Compact - CB .., CC .., CD .. (tous les codes de véhicules qui commencent par CB, CC ou CD. Exemples: CBAR, CDAR, CCAR)
  • économie - EB .. , CE .., ED ..
  • Full-Size - FB .., FC .., FD ..
  • Luxury - L ... (commence par L)
  • Van - .F .. (le deuxième caractère est F)
  • Convertible - .T .. (second caractère est T, par exemple: dtAR)
  • hybride - ... H (quatrième caractère est H ou I, par exemple: CCAH)
  • électrique -. ..C (quatrième caractère est C ou E, par exemple: CCAE)

Exemples d'entrée (chaque code de véhicule aura toujours 4 caractères):

  1. ECAR
  2. CCAR
  3. SFAR
  4. STAR
  5. LTAR

Résultats escomptés:

  1. [category] => Array ([0] => Economie)
  2. [category] => Array ([0] => Compact)
  3. [category] = > Tableau ([0] => SUV)
  4. [category] => Tableau ([0] => convertible)
  5. [category] => Array ([0] => Luxury [1] => Convertible)

code:

 $vehicle_code = str_split($new_car->type); 
     $categories = [ 
      'CB' => 'Compact', 
      'CC' => 'Compact', 
      'CD' => 'Compact', 

      'EB' => 'Economy', 
      'EC' => 'Economy', 
      'ED' => 'Economy', 

      '0L' => 'Luxury', 

      '1T' => 'Convertible', 
      '1V' => 'Van', 

      '3H' => 'Hybrid', 
      '3I' => 'Hybrid', 
      '3C' => 'Electric', 
      '3E' => 'Electric', 
     ]; 

     foreach($vehicle_code as $key=>$character) { 
      if (array_key_exists($key.$character,$categories)) 
      { 
       $new_car->category[] = $categories[$key.$character]; 
      } 
     } 

     if (array_key_exists(substr($new_car->type, 0, 2),$categories)) 
     { 
      $new_car->category[] = $categories[substr($new_car->type, 0, 2)]; 
     } 
+1

Peut-être juste moi, mais je n'ai pas la moindre idée ce que vous demandez en fait. – Andreas

+0

J'ai peut-être compris ce que vous demandez. Est-ce que c'est dans la bonne direction? https://3v4l.org/TRYEL – Andreas

+1

@Andreas J'ai mis à jour la question avec quelques informations supplémentaires. Faites-moi savoir si cela a plus de sens maintenant. –

Répondre

0

Au lieu d'avoir une liste de tous les codes de véhicules, ont des listes séparées pour le code du premier caractère/paires de catégorie et le dernier code caractères/paires catégorie. Ensuite, dans votre boucle, vous pouvez utiliser substr($your_vehicle_code, $index_0_or_1, 1) pour obtenir le premier ou le deuxième caractère et vérifier son existence dans le tableau correspondant. Cela vous permettra de réduire les trois entrées de Compact, Economy, Premium, Mid-Size, et Standard pour chacune d'entre elles et de mettre votre fonctionnalité plus en conformité avec les exigences fournies.

Par exemple, votre premier réseau de catégories de caractères pourrait ressembler à ceci:

$first_char_categories = [ 
    'C' => 'Compact', 
    'E' => 'Economy', 
    'I' => 'Mid-Size', 
    'P' => 'Premium', 
    'S' => 'Standard' 
]; 

Vous pouvez alors vérifier le code comme ceci:

$my_vehicle_code = 'CB'; 
$first_char = substr($my_vehicle_code, 0, 1); //gives us the character 'C' 
if(isset($first_char_categories[$first_char])) { 
    $first_char_category = $first_char_categories[$first_char]; 
    //do something with the first character category 
} 
+0

J'ai mis à jour la description. Pour Compact, Economy, Mid-Size, Premium et Standard, nous devrions regarder les deux premiers caractères. Cela diffère pour les autres. C'est seulement le deuxième caractère ou le quatrième caractère qui détermine le groupe dans lequel la voiture doit tomber. Ça vous dérange de prendre un autre regard?Je vous remercie. –

0

Essayez ceci:

I N'avez ajouté que ceux que vous avez énumérés dans l'exemple, mais simplement suivre le modèle pour les autres.
J'ai aussi changé le "T" et "F" où vous avez eu "1T", le 1 est-il important?

$re = '/(EC)\w{2}|(CC)\w{2}|\w(F)\w{2}|(LT)\w{2}|\w(T)\w{2}/'; 
$str = 'STAR'; 

preg_match($re, $str, $matches); 

// Remove empty values and reset keys 
$cat = array_values(array_filter($matches)); 

    $categories = [ 
     'CB' => 'Compact', 
     'CC' => 'Compact', 
     'CD' => 'Compact', 

     'EB' => 'Economy', 
     'EC' => 'Economy', 
     'ED' => 'Economy', 

     'IB' => 'Mid-Size', 
     'IC' => 'Mid-Size', 
     'ID' => 'Mid-Size', 

     'PB' => 'Premium', 
     'PC' => 'Premium', 
     'PD' => 'Premium', 

     'SB' => 'Standard', 
     'SC' => 'Standard', 
     'SD' => 'Standard', 

     '0L' => 'Luxury', 

     'F' => 'SUV', 
     '1G' => 'Crossover', 
     '1K' => 'Commercial', 
     '1P' => 'Pickup Truck', 
     '1Q' => 'Pickup Truck', 
     '1R' => 'RV', 
     '1S' => 'Sports', 
     'T' => 'Convertible', 
     '1V' => 'Van', 
     '1W' => 'Wagon', 

     '3H' => 'Hybrid', 
     '3I' => 'Hybrid', 
     '3C' => 'Electric', 
     '3E' => 'Electric', 
    ]; 

//Echo category 
Echo $categories[$cat[1]]; 

https://3v4l.org/Sg5Xe