6
votes

Comment puis-je facilement supprimer la dernière virgule d'un tableau?

disons que j'ai ceci:

$array = array("john" => "doe", "foe" => "bar", "oh" => "yeah");

foreach($array as $i=>$k)
{
echo $i.'-'.$k.',';
}


0 commentaires

10 Réponses :


7
votes

Une méthode consiste à utiliser substr code> xxx pré >

Une autre méthode utiliserait imploral code> p>

$array = array("john" => "doe", "foe" => "bar", "oh" => "yeah");

$output = array();
foreach($array as $i=>$k)
{
    $output[] = $i.'-'.$k;
}

echo implode(',', $output);


0 commentaires

20
votes

Vous pouvez également utiliser le rtrim code> fonction AS:

$result = '';
foreach($array as $i=>$k) {
    $result .= $i.'-'.$k.',';
}
$result = rtrim($result,',');
echo $result;


11 commentaires

Oui, j'ai oublié de la coupe. +1


Dommage PHP ne prend pas en charge nonset ($ Résultat [SHLEN ($ Résultat) -1]) . Ce serait si gentil ...


@NullUSeException: hum, mais vous pouvez faire string [0] = 'A' . Donc, vous peut les changer. Seuls les compensations de string non sélectionnant ne sont pas possibles. Cela n'a pas de sens pour moi, car les chaînes prennent en charge toutes les opérations de tableau ( offsetTiet , offsetset , offsetexistes ) à part non défini < / code> ( offseCetSet ).


@niki je n'appellerais pas non sorti d'une opération de compensation arbitraire. Si c'est le dernier, oui; Mais par le principe du moins d'étonnement, vous ne voudrez pas que cela favorise désapprouver le dernier élément mais pas les autres.


@Daniel K: Que l'appelleriez-vous à la place? C'est l'une des opérations que l'interface arrayAccess définit. Et ces IMHO sont les opérations de réseau;)


@niki Le problème est que les matrices de PHP sont des hashmaps, mais la mise en œuvre sous-jacente des chaînes PHP est (AFAIK) un tableau de caractères (par exemple: un "réel" tableau)


@NULLUSEXEXCEPTION: Oui, vous avez raison, la mise en œuvre sous-jacente est différente. Je m'attendrais toujours à ce que toutes les opérations sur un tableau soient également disponibles pour les chaînes, car les chaînes ne sont qu'une forme spéciale de tableaux;)


@niki Eh bien, je viens de faire substr ($ str, 0, -1) si j'ai besoin de supprimer le dernier caractère.


@NullUSeException: Eh bien, je fais cela aussi, car il n'y a pas une autre possibilité. Mais j'aimerais désapprendre plus, car dans cette affaire, PHP n'aurait pas besoin de copier la chaîne entière à une nouvelle partie de la mémoire;)


@niki mais c'est exactement le point; Si vous non définissez un élément arbitraire d'un véritable matrice, vous devrez copier la chaîne entière à un nouveau morceau de mémoire (sauf si c'est le dernier élément)


@NULLUSEXEXCEPTION: Le "sauf" n'est pas rare;) En outre, en fonction de la mise en œuvre, vous n'avez pas besoin de copier la chaîne entière. Par exemple, vous pouvez décrémenter la propriété de longueur de la chaîne et déplacer tous les caractères à partir d'un index particulier. C'est toujours plus rapide puis la copie tout.



0
votes

Essayez ce code après la condition foreach, puis echo $ résultat1 xxx


0 commentaires

3
votes

Je n'aime pas cette idée d'utiliser des substrateurs du tout, car c'est le style de mauvaise programmation. L'idée est de concaténer tous les éléments et de les séparer par des phrases spéciales "séparatrices". L'idée d'appeler la sous-chaîne pour cela est de savoir utiliser un laser pour tirer les oiseaux.

Dans le projet, je suis en train de traiter, nous essayons de nous débarrasser des mauvaises habitudes dans le codage. Et cet échantillon est considéré comme l'un d'entre eux. Nous forcions les programmeurs à écrire ce code comme celui-ci: xxx

Le but de ce code est beaucoup plus clair que celui qui utilise le substruisement. Ou vous pouvez simplement utiliser IMPLODE FONCTION (notre projet est en Java, nous avons donc dû concevoir notre propre fonction pour concaténer des cordes de cette façon). Vous devez utiliser une fonction substruisante uniquement lorsque vous avez un besoin réel de cela. Ici, cela devrait être évité, car c'est un signe de mauvais style de programmation.


3 commentaires

Comment est-ce un signe de mauvais style de programmation? Cela vous dérangeriez-vous d'élaborer à ce sujet pour nous tous? Autant que je puisse le constater, cela n'hésite pas à la performance. Je peux comprendre la partie de clarté, mais en même temps, il n'est pas difficile de lire sur quel substrateur pour le comprendre. Merci!


IMHO, chaque outil doit être utilisé de manière appropriée dans les programmes et ce n'est pas un objectif substrable de servir de concaténation à la chaîne, il a été conçu pour d'autres problèmes. En outre, ce code avec substraire ne semble clair que ce que c'est au même endroit. S'il y a de nombreux fragments comme celui-ci, le code se transforme en illisible. Par conséquent, dans notre projet, nous avons changé en concaténation normale et avons également fait une fonction spéciale pour cela. Maintenant, la partie du projet qui traite des chaînes est beaucoup plus lisible.


Merci beaucoup pour cette excellente solution professionnelle. (y)



1
votes

J'utilise toujours cette méthode:

$result = '';
foreach($array as $i=>$k) {
    if(strlen($result) > 0) {
        $result .= ","
    }
    $result .= $i.'-'.$k;
}
echo $result;


2 commentaires

Mauvaise idée d'utiliser SHLEN pour cela. Voir l'article de Joel Spolsky «Retour à la base» afin de voir pourquoi. Utilisez simplement un drapeau booléen pour effectuer une telle vérification, car dans le pire des cas (tableau a n éléments - caractères simples), vous finirez par une complexité O (N ^ 2).


En général, n'utilisez pas de fonctions de chaîne afin d'obtenir un effet, qui peut être facilement réalisée par de simples astuces de programmation (la même chose est vraie pour utiliser Substr afin de se débarrasser de la dernière virgule - il vaut mieux ne pas générer la dernière comman du tout).



11
votes

Je n'aime pas toutes les recettes précédentes.

PHP n'est pas C et a des moyens de manière plus élevé de traiter ce problème particulier. P>

Je vais commencer par le point où vous avez un tableau comme celui-ci: P>

echo implode(',', $array);


4 commentaires

Cette approche bénéfice que nous pouvons changer le délimiteur plus facile. De plus, vous pouvez exploser la chaîne à la matrice plus tard similaire à celle-ci. Pas sûr de l'inconvénient de la performance


J'aime ça mieux ça aussi. Ne boucle pas si vous n'êtes pas obligé.


Apparemment, vous n'avez même pas lu toutes les recettes précédentes , car cela était déjà suggéré par Premiso.


Il a été suggéré par moi, mais je n'ai pas utilisé la fonction array_map , mais merci Captaintokyo. @Powertieke, il fait boucle, comme array_map () devrait faire boucler les données. J'ai pris que le tableau de l'OP posté n'était qu'une démonstration de ses données qu'il a ailleurs.



0
votes

Cela ferait:

rtrim ($string, ',')


0 commentaires

1
votes

En supposant que le tableau est un index, cela fonctionne pour moi. Je boucle i $ i et testez $ i contre la clé $. Lorsque la clé se termine, les virgules ne sont pas imprimés. Notez que le SI a deux valeurs pour vous assurer que la première valeur n'a pas de virgule au tout début.

foreach($array as $key => $value)
{
    $w = $key;
    //echo "<br>w: ".$w."<br>";// test text
    //echo "x: ".$x."<br>";// test text
    if($w == $x && $w != 0 )
    {
    echo ", ";
    }
    echo $value;
    $x++;
}


0 commentaires

0
votes

Voir cet exemple, vous pouvez facilement comprendre xxx


1 commentaires

Devrait être soit $ clé + 1 ou compter (nom $) - 1.



0
votes

J'ai supprimé la virgule de la dernière valeur du tableau en utilisant la dernière clé de la matrice. J'espère que cela vous donnera une idée.

   $last_key =  end(array_keys($myArray));
                           foreach ($myArray as $key => $value ) {
                              $product_cateogry_details="SELECT * FROM `product_cateogry` WHERE `admin_id`='$admin_id' AND `id` = '$value'";
                                  $product_cateogry_details_query=mysqli_query($con,$product_cateogry_details);
                                  $detail=mysqli_fetch_array($product_cateogry_details_query);

                                  if ($last_key == $key) {
                                    echo $detail['product_cateogry'];
                                  }else{
                                    echo $detail['product_cateogry']." , ";
                                  }

                          }


0 commentaires