Funktionswechsel zwischen Singular und Plural?

Lesezeit: 8 Minuten

Benutzer-Avatar
dynamisch

Ich suche nach einer Funktion, die bei einer gegebenen Zeichenfolge die Zeichenfolge in Singular/Plural umschaltet. Ich brauche es, um für andere europäische Sprachen als Englisch zu arbeiten.

Gibt es Funktionen, die das können? (Angegeben eine zu konvertierende Zeichenfolge und die Sprache?)

Vielen Dank

  • Welche andere europäische Sprache?

    – Gumbo

    18. Januar 2011 um 21:00 Uhr

  • Los geht’s: $result = (preg_match('~s$~i', $string) > 0) ? rtrim($string, 's') : sprintf('%ss', $string);. 😛

    – Alix Axel

    18. Januar 2011 um 21:11 Uhr

  • Der Trick bei vielen Sprachen ist, dass ein Plural nicht nur aus dem Substantiv gebildet wird, so wie Englisch ein ‘s’ hinzufügt, sondern auch der Artikel und die Adjektive pluralisiert werden. Angesichts der Schwierigkeiten beim Analysieren natürlicher Sprache, um Substantive mit den richtigen Modifikatoren zu verknüpfen, speichert die meiste Software, die ich kenne, nur manuelle Übersetzungen sowohl von Plural- als auch von Nicht-Plural-Versionen.

    – Karl Bielefeldt

    18. Januar 2011 um 21:18 Uhr

  • @Alix Axel: … scheitert an Dingen wie box, loss und viele mehr 😉

    – Niko

    18. Januar 2011 um 21:36 Uhr

  • Dieses ist für die englische Sprache, aber es könnte Ihnen etwas Inspiration geben: github.com/flourishlib/flourish-classes/blob/master/…

    – Lützen

    7. März 2014 um 11:55 Uhr

Benutzer-Avatar
Sophivorus

Hier ist meine praktische Funktion:

function plural( $amount, $singular="", $plural="s" ) {
    if ( $amount === 1 ) {
        return $singular;
    }
    return $plural;
}

Standardmäßig fügt es nur das ‘s’ nach der Zeichenfolge hinzu. Zum Beispiel:

echo $posts . ' post' . plural( $posts );

Dies gibt ‘0 Posts’, ‘1 Post’, ‘2 Posts’, ‘3 Posts’ usw. wieder. Sie können aber auch Folgendes tun:

echo $replies . ' repl' . plural( $replies, 'y', 'ies' );

Was ‘0 Antworten’, ‘1 Antwort’, ‘2 Antworten’, ‘3 Antworten’ usw. widerspiegelt. Oder alternativ:

echo $replies . ' ' . plural( $replies, 'reply', 'replies' );

Und es funktioniert auch für einige andere Sprachen. Auf Spanisch mache ich zum Beispiel:

echo $comentarios . ' comentario' . plural( $comentarios );

Was ‘0 Kommentare’, ‘1 Kommentar’, ‘2 Kommentare’, ‘3 Kommentare’ usw. widerspiegelt. Oder wenn das Hinzufügen eines ‘s’ nicht der Weg ist, dann:

echo $canciones . ' canci' . plural( $canciones, 'ón', 'ones' );

Was ‘0 Canciones’, ‘1 Canciones’, ‘2 Canciones’, ‘3 Canciones’ usw. widerspiegelt.

  • Ich finde diese Option eigentlich ganz gut.

    – Nick Coad

    23. Mai 2013 um 1:53 Uhr

  • Das ist wirklich schön. Kompaktere Version: function plural( $amount, $singular = '', $plural = 's' ) { return ( $amount == 1 ) ? $singular : $plural; }

    – Bryceadams

    22. März 2015 um 4:49 Uhr


  • Dies funktioniert nicht mit dynamischen Werten. Was passiert, wenn das Singular/Plural-Wort nicht bekannt ist?

    – Karns

    8. Dezember 2015 um 19:33 Uhr

Für diese Art von Operation ist keine Funktion in PHP eingebaut. Es gibt jedoch einige Tools, die Sie verwenden können, um Ihr Ziel zu erreichen.

Es gibt eine inoffizielle Google-Wörterbuch-API, die Informationen zu Pluralformen enthält. Sie können mehr darüber lesen diese Methode hier. Sie müssen ein JSON-Objekt analysieren, um die entsprechenden Elemente zu finden, und diese Methode ist in der Regel etwas langsam.

Die andere Methode, die mir in den Sinn kommt, ist die Verwendung von aspell oder einem seiner Verwandten. Ich bin mir nicht sicher, wie genau die Wörterbücher für andere Sprachen als Englisch sind, aber ich habe aspell verwendet, um Wörter in ihre verschiedenen Formen zu erweitern.

Ich weiß, dass dies nicht die hilfreichste Antwort ist, aber hoffentlich gibt es Ihnen eine allgemeine Richtung, in der Sie suchen können.

  • Die Google API scheint nicht mehr aktiv zu sein.

    – arvidj

    24. Februar 2015 um 19:15 Uhr

Das ist nicht einfach: Jede Sprache hat ihre eigenen Regeln für die Pluralbildung von Substantiven. Im Englischen ist es so, dass Sie “-s” an das Ende eines Wortes setzen, es sei denn, es endet auf “-x”, “-s”, “-z”, “-sh”, “-ch”. falls Sie “-es” hinzufügen. Aber dann gibt es “Maus” => “Mäuse”, “Schafe” => “Schafe” usw.

Das erste, was Sie tun müssen, ist herauszufinden, welche Regel(en) gelten, um den Plural aus dem Substantiv im Singular in der/den Sprache(n) zu bilden, mit der/denen Sie arbeiten möchten. Aber das ist nicht die ganze Lösung. Ein weiteres Problem ist das Erkennen von Substantiven. Wenn Sie ein Substantiv erhalten und es vom Singular in den Plural umwandeln müssen, ist das nicht allzu schwierig, aber wenn Sie ein Stück freien Text erhalten und die Substantive im Singular finden und in den Plural umwandeln müssen, ist das viel schwieriger. Sie können Listen von Substantiven erhalten, aber natürlich können einige Wörter Substantive und Verben sein (“jagen”, “fischen”, “brechen” usw.), also müssen Sie den Text analysieren, um die Substantive zu identifizieren.

Es ist ein großes Problem. Es gibt wahrscheinlich ein KI-System, das das tun würde, was Sie brauchen, aber ich kann mir nicht vorstellen, dass es etwas Kostenloses geben wird, das alles kann.

  • Ein weiteres Problem besteht darin, dass Substantive in einigen europäischen Sprachen männlich und weiblich sein können und die Regeln für ihre Pluralbildung sich je nach Geschlecht ändern. Um die Sache noch komplizierter zu machen, gibt es keine Regel, um festzustellen, ob ein Wort männlich oder weiblich ist, Sie müssen es in einem Wörterbuch nachschlagen.

    – Niko

    18. Januar 2011 um 21:42 Uhr

  • Nun, wenn Sie es googeln, gibt es eine Reihe von Funktionen, die den Trick in PHP ausführen. Das Problem ist, dass sie nur für Englisch funktionieren. Ich brauche es für andere europäische Sprachen.

    – dynamisch

    18. Januar 2011 um 22:27 Uhr

  • @ yes123: Ich habe eine für Portugiesisch codiert, sie behandelt korrekt weibliche / männliche Inflationen.

    – Alix Axel

    18. Januar 2011 um 23:10 Uhr

  • @Alix Axel: Ich kann kein Portugiesisch, gibt es eine klare Regel, um festzustellen, ob ein Wort männlich oder weiblich ist?

    – Niko

    18. Januar 2011 um 23:12 Uhr

  • @nico: Eine klare Regel? Das würde ich nicht sagen, nein. Ich musste mir ein “prontuário” (übersetzt “Diagramm” – mehr oder weniger ein Wörterbuch für Grammatikregeln) kaufen, um zu entdecken, dass einige Pluralisierungen von der Art der schließenden Diphthonge abhängen. Meine Implementierung ist nicht perfekt – ich habe es nur geschafft, die meisten Wörter aufzublasen, nicht alle Worte – das wäre eine extrem schwierige Aufgabe.

    – Alix Axel

    19. Januar 2011 um 0:41 Uhr

Nur englische Lösung

Hier ist eine PHP-Klasse, die für mich bisher einwandfrei funktioniert hat:
http://kuwamoto.org/2007/12/17/improved-pluralizing-in-php-actionscript-and-ror/

Hier ist es als Zusammenfassung für den Fall, dass diese Seite verschwindet:
https://gist.github.com/tbrianjones/ba0460cc1d55f357e00b

Dies ist eine kleine Klasse und könnte einfach und schnell in andere Sprachen umgewandelt werden.

Für alle, die 2021 immer noch darüber stolpern, empfehle ich die Verwendung des Inflektorpaket aus Lehre.

Doctrine Inflector ist eine kleine Bibliothek, die String-Manipulationen in Bezug auf Groß-/Kleinbuchstaben und Singular/Plural-Formen von Wörtern durchführen kann.

Zum Zeitpunkt der Erstellung dieses Artikels werden Englisch, Französisch, Norwegisch (Bokmal), Portugiesisch, Spanisch und Türkisch unterstützt.

Installieren Sie es einfach mit Composer: composer require doctrine/inflector und benutze es so:

<?php
// Composer autoloading (your project probably already does this)
require __DIR__ . '/vendor/autoload.php';

// Build the inflector:
$inflector = \Doctrine\Inflector\InflectorFactory::create()->build();

// Singularize a word:
$inflector->singularize('houses'); // house
$inflector->singularize('vertices');  // vertex

Benutzer-Avatar
Benutzer28864

Hier ist eine schnelle Funktion, die ich normalerweise für weniger komplexe Szenarien verwende:

public static function getPluralPrase($phrase,$value){
    $plural="";
    if($value>1){
        for($i=0;$i<strlen($phrase);$i++){
            if($i==strlen($phrase)-1){
                $plural.=($phrase[$i]=='y')? 'ies':(($phrase[$i]=='s'|| $phrase[$i]=='x' || $phrase[$i]=='z' || $phrase[$i]=='ch' || $phrase[$i]=='sh')? $phrase[$i].'es' :$phrase[$i].'s');
            }else{
                $plural.=$phrase[$i];
            }
        }
        return $plural;
    }
    return $phrase;
}

Für eine komplexere Lösung können Sie jedoch @T verwenden. Die Lösung von Brian Jones

Benutzer-Avatar
Madmarsu

Ich mag die Antwort von James Constantino. Einfach und effizient, und Sie meistern sicher jeden Fall, in jeder Sprache. Obwohl man mehr Code schreiben muss (nämlich doppelt so viel wie der gemeinsame Teil des Wortes).

Ich mag natürlich auch die TBrianJones-Lösung, aber sie funktioniert nur mit Englisch (so wie sie ist. Ich kann sie leicht für meine üblichen europäischen Sprachen Deutsch, Französisch, Spanisch, Italienisch und Portugiesisch erweitern). Danke dafür. Wenn Sie die Häufigkeit der verwendeten Wörter kennen, können Sie sie optimieren, indem Sie die Zeilen neu organisieren.

Auch Felipe’s Vorschlag ist gut, und übrigens plebiszitiert.

Aber in jeder Lösung fand ich, was ich als Fehler betrachte: Jeder von Ihnen verwendet die Singularform nur für den Wert 1 und die Pluralform für jeden anderen Fall. Was für negative Werte offensichtlich falsch ist, aber auch – zumindest auf Französisch – für Werte, die streng kleiner als 2 sind.

Hier ist also mein Vorschlag, der James’ Code als Basis nimmt, optimiert:

function singleOrPlural($amount, $singular, $plural) {
  return (abs($amount)>=2
    ? $amount.' '.$plural 
    : $amount.' '.$singular
  );
}

Also ein Code wie

echo "We bought ".singleOrPlural(1.5, "pound", "pounds")
    ." of apples and ".singleOrPlural(2, "pound", "pounds")." of bread.";

wird geben

We bought 1.5 pound of apples and 2 pounds of bread.

welches ist richtig.

Für den Nullwert kann ich den Grund für einen Plural nicht verstehen, da es kein Objekt gibt, aber vielleicht werden angelsächsische Ureinwohner damit verwendet.

HTH, M.

1049680cookie-checkFunktionswechsel zwischen Singular und Plural?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy