2016-12-12 1 views
1

J'ai un tableau, je veux vérifier si les clés ont '-main' après eux. Si elles ont '-main', alors je veux obtenir le texte avant '-main'. Je fais:Diviser une clé de tableau et voir si elle contient une valeur

$myVar = substr($key, 0, -5); 
  1. est-il un moyen plus efficace de diviser la clé, donc je ne dois pas faire deux chaînes de sous? Peut-être que je ne veux plus utiliser '-main' et que je souhaite utiliser un élément de recherche de longueur différente, peut-être en tant que variable. Je devrais alors faire un compte de personnage plutôt que de spécifier -5. Y a-t-il un moyen d'incorporer une variable sans avoir à faire le nombre de caractères?

+1

Depuis que votre code fonctionne, je pense qu'un meilleur endroit pour cette question serait à [Code Review] (http://codereview.stackexchange.com/) –

+0

Magnus Eriksson - ajouté à la revue de code, quelqu'un a migré retour à SO - http://stackoverflow.com/questions/41105395/checking-if-an-array-key-contains-a-value – panthro

Répondre

1

Il existe d'autres moyens, mais je pense que le plus facile à tester et la capture serait:

$needle = '-main'; 

foreach ($data as $key => $value) { 
    if (preg_match("/(.*)$needle\$/", $key, $match)){ 
     $myVar = $match[1]; 
    } 
} 
  • Vérifiez pour un match de $needle à la fin de la chaîne $ et capturer tout avant il (.*)
  • Si trouvé, assigner la substance du premier groupe de capture (.*) à $myVar

Vous pouvez également utiliser strstr(), mais aurait besoin de décider comment gérer $myVar être faux si $needle ne se trouve pas:

if ($myVar = strstr($key, $needle, true)){ 
    .... 
} 

Pour le trouver partout dans le $key et capturer tout le reste:

if (strpos($key, $needle) !== false){ 
    $myVar = str_replace($needle, '', $key); 
} 
+0

Merci, y aurait-il aussi un moyen de vérifier l'aiguille n'importe où dans la chaîne? Et affectez $ myVar à la valeur de la clé sans l'aiguille $ – panthro

+0

Oui, édité d'une manière. – AbraCadaver

+1

Notez que la vérification 'strpos' est facultative, ce qui signifie que seule une fonction de chaîne * est nécessaire pour effectuer la vérification et la capture. [Voir sur 3v4l.org] (https://3v4l.org/EmN0V) – bishop