2016-11-28 2 views
1

De ma demande, j'envoie une liste d'utilisateurs que je veux rechercher le groupe auquel ils sont abonnés:code php pour rechercher plusieurs mots dans varchar

$selectedUsers = ["John", "Carlos", "Anna", "Julia"] 

J'ai dans ma base de données de différents groupes avec de nombreux les utilisateurs chacun d'entre eux:

$football = ["**John**" ,"**Carlos**" ,"Daniel" ,"Rob" ,"Frank" ,"Bob"] 

$cooking = ["**John**" , "**Anna**" , "**Julia**" , "Claudia" , "Rob" , "Adriana"] 

$startups = ["**John**", "**Carlos**", "**Anna**", "**Julia**", "Rob", "Adriana"] 

la sortie Je veux avoir la liste est triée des groupes avec le montant des selectedUsers en elle:

$returnArray[0] = $startups //4 users inside group 
$returnArray[1] = $cooking //3 users inside group 
$returnArray[2] = $football //2 users inside group 

Voici le code que j'ai jusqu'à présent, mais la boucle j'utilise est basé sur le group_id que j'ai emmagasinés et je veux changer cela:

<?php 
    //fetch groups with users 

    $returnValue = array(); 
    $groupUsersNumber = 0; 

    $selectedUsers = htmlentities($_REQUEST["selectedUsers"]); 
    $lastGroupID = htmlentities($_REQUEST["lastGroupID"]); //remove 

    if($lastGroupID == ""){ 
     $lastGroupID = getLastGroupID(); 
     $lastGroupID = $lastGroupID + 1; 
    } 

    if($selectedUsers == ""){ 
     //return all groups ordered by ID desc 

     $group = getGroupWithID($lastGroupID); 

    } else{ 

     $usersArray = explode(', ', $selectedUsers); 
     $foundGroup = false; 
     while($foundGroup == false){ 

      $group = getGroupWithID($lastGroupID); 

      $fetchedGroupUsers = explode(', ', $group["users"]); 
      for($i = 0; $i < count($usersArray); $i++){ 
       if(in_array($usersArray[$i], $fetchedGroupUsers)){ 
        $foundGroup = true; 
        break; 
       } else{ 
        $lastGroupID = $group["group_id"]; 
       } 
      } 
     } 
    } 

    for($i = 0; $i < count($usersArray); $i++){ 
     if(in_array($usersArray[$i], $fetchedGroupUsers)){ 
      $groupUsersNumber = $groupUsersNumber + 1; 
     } 
    } 

    if(empty($group)) 
    { 
     $returnValue["status"]="403"; 
     $returnValue["message"]="No more groups with that users."; 
     echo json_encode($returnValue); 
     return; 
    } else{ 

     $returnValue=$group; 
     $returnValue["groupUsersNumber"]=$groupUsersNumber; 
    } 

    echo json_encode($returnValue); 
?> 

est-il un autre moyen d'avoir un meilleur/moyen plus efficace de rechercher dans ma base de données? Apprécié!

+1

Je ne trouve aucun code lié à la base de données. – arkascha

+2

Comment les stockez-vous dans une base de données? Si une base de données correctement normalisée, il serait probablement plus facile de le faire en SQL avant tout traitement en php – Kickstart

+0

si vous avez une base de données, s'il vous plaît 'describe'. Ainsi, la relation entre utilisateurs et groupes (idéalement plusieurs à plusieurs) nous aidera à exposer une meilleure solution. – marmeladze

Répondre

1

Il semble que votre base de données ne soit pas normalisée. Une base de données normalisée peut être le moyen le plus efficace. Ne stockez pas les utilisateurs dans un varchar décrivant. Au lieu d'établir une relation plusieurs à plusieurs. A côté de cela, la classe FilterIterator de PHP est faite pour vous. Il est réutilisable et un peu plus efficace pour itérer sur des tableaux.

Voici un petit exemple.

class NameFilterIterator extends FilterIterator { 

    protected $filter = null; 

    public function __construct(Iterator $iterator, $filter) { 
     parent::__construct($iterator); 
     $this->filter = $filter; 
    } 

    public function accept() { 
     $current = $this->getInnerIterator()->current(); 

     if (strpos($current, $this->filter) !== false) { 
      return true; 
     } 

     return false; 
    } 
} 

// Usage 
$aUsers = [ 'John', 'Carlos', 'Anna', 'Julia' ]; 
$oFootball = new ArrayIterator(["**John**" ,"**Carlos**" ,"Daniel" ,"Rob" ,"Frank" ,"Bob"]); 

foreach ($aUsers as $sUser) { 
    $oFilter = new NameFilterIterator($oFootball, $sUser); 
    foreach ($oFilter as $sName) { 
     var_dump($sName); // outputs: John, Carlos 
    } 
} 

L'utilisation de la mémoire interne de l'objet FilterIterator est beaucoup plus efficace.

1

Vous semblez mélanger PHP et MySQL, et il serait préférable de revoir votre base de données. Cependant, à titre d'idée de base, vous pouvez faire à peu près ce que vous voulez dans MySQL. Ce n'est pas sympa, et pas efficace, mais quelque chose comme ceci: -

SELECT a.group_description , 
     GROUP_CONCAT(b.wanted_name) 
FROM some_table a 
LEFT OUTER JOIN 
(
    SELECT "John" AS wanted_name UNION SELECT "Carlos" UNION SELECT "Anna" UNION SELECT "Julia" 
) b 
ON FIND_IN_SET(b.wanted_name, a.group_users) 
GROUP BY a. group_description