[RESOLU] Notice: Trying to get property of non-object in

Eléphant du PHP | 153 Messages

27 mai 2019, 18:47

Juste pour voir j'ai relancé le tout il a mis 50 secondes pour refaire les 393672 mots ... Bigreee je n'en reviens pas :)

Avatar du membre
Mammouth du PHP | 1609 Messages

27 mai 2019, 18:55

LOL ^^
Bah oué les index c'est très important. Sans, le moteur ben il doit chercher, alors qu'avec il sait directement où est la ligne.
Alors tout est bon du coup ?
Développeur web depuis + de 20 ans

Eléphant du PHP | 153 Messages

27 mai 2019, 19:11

Oui tout est bon, je vais juste modifier la colonne " scrabble_nbr " c'est le nombre de lettres par mot .

Je vais essayé de faire ça je sens que je vais y arrivé, je suis motivé du coup :)

Avatar du membre
Mammouth du PHP | 1609 Messages

27 mai 2019, 19:15

Cool, content d'avoir pu t'aider. :)
Développeur web depuis + de 20 ans

Eléphant du PHP | 153 Messages

27 mai 2019, 19:18

Si tu ne vois pas d’inconvénient une fois terminé en bas de mon site je vais laisser un mot avec un lien vers ton profile (d'ici)

Avatar du membre
Mammouth du PHP | 1609 Messages

27 mai 2019, 19:25

J'apprécie le geste mais tu n'es pas obligé ;)
Si j'aide ici, c'est pour le plaisir d'aider, pour me mettre au défi et surtout pour étaler toute ma confiture. :mrgreen:
Développeur web depuis + de 20 ans

Eléphant du PHP | 153 Messages

27 mai 2019, 20:48

Non mais lorsque je vois que sur un autre site on m'a envoyé me promener et qu'ici j'ai des réponses rapide avec des sources au TOP et en plus on me donne des astuces super instructifs ... C'est trop cool :)

Eléphant du PHP | 153 Messages

27 mai 2019, 21:05

Voilà pour la BD je crois avoir terminé
https://zupimages.net/up/19/22/xtoe.png
J'ai revu le calcul du nombre de lettres (il avait compté 2 lettres pour un caractère avec accent .. bizarre mais du coup je lui ai demandé de recalculer via la colonne sorted_letters ( je deviens bon :) )

Par la suite je vais lui demander de me donner les anagrammes de la longueur du mot jusqu'au au mini : exemple : vaine==>vina==>via==> ai

Avatar du membre
Mammouth du PHP | 1609 Messages

27 mai 2019, 21:35

Héhé, tu deviens bon c'est clair :mrgreen:

Le coup des caractères accentués qui comptent double c'est encore dû à l'encodage et ça me laisse supposer que ta base de données est en utf-8 ainsi que tes fichiers php, mais qu'en revanche le default charset de php doit être autre (j'imagine iso-8859-1). En utf-8 les caractères accentués sont encodés sur 2 octets c'est pour cela que quand tu les affiches dans un encodage dont tous les caractères sont encodé sur 1 seul octet, tu as 2 caractères qui s'affichent (correspondant au premier et au deuxième octet du caractère accentué). Et donc logiquement si tu fais un strlen d'une chaine encodé utf-8 avec un php dont le default charset a tous ses caractères encodé sur un octet, il va te compter 2 de longueurs pour ton caractère accentué.
Si seuls les caractères accentués sont remplacés par 2 caractères mais que tous les autres caractères eux ne changent pas c'est que la plupart des caractères classiques sont encodés de la même manière (par la même suite de bits) dans les différents encodage.
Développeur web depuis + de 20 ans

Eléphant du PHP | 153 Messages

27 mai 2019, 21:39

C'est clair, utf8 toujours un problème pour moi mais j'arrive à m'en sortir :)
à l'occasion je n'ai peut être pas le droit mais tu iras faire un tour sur mon site : tu cherches "La vie à Mulhouse" :)

Eléphant du PHP | 153 Messages

08 juin 2019, 23:15

Bonjour,

Bien que le sujet soit résolu, je reviens vers celui ci pour un autre problème que je n'arrive pas à résoudre.

Je voudrais chercher dans la BD les combinaisons possibles avec au départ un mot (garder les mêmes lettres) :
Exemple:
au départ j'ai ce mot "harpes"
Il me donne :
harpés , phares, phaser, phrasé, raphes, sherpa
Anagramme 5 lettres (11 mots trouvés)
après, aspre, épars, espar, parés, parse, prase, râpés, repas, saper, spare
Anagramme 4 lettres (3 mots trouvés)
pers, près, reps
Anagramme 3 lettres (1 mots trouvés)
sep
Anagramme 2 lettres (2 mots trouvés)
ès, se

Mais si l'on regarde bien il manque des possibilités : sa,are,phrase etc .



j'ai fait ceci mais ce n'est pas bon.

Code : Tout sélectionner

$nbr=strlen($monmotNET); // 6 for ($i=$nbr; $i>1; $i--) { require ('mysqli_conn.php'); $conn = new mysqli($servername, $username, $password, $dbname); $monmotNET=substr($monmotNET, -$i, $i); $sorted_letters = $conn->real_escape_string(sort_alpha_noaccent_tolower($monmotNET));// l'anagramme unique de recherche $query = "SELECT * FROM dictionnaire WHERE sorted_letters = '$sorted_letters'";// sélectionne tous les mots du dictionnaire ayant cet anagramme unique $words = $conn->query($query); while ($word = $words->fetch_object()) { $nbrAna++; $Multianagramme.= '&nbsp;<a href="https://www.verifier-mots.fr/'.suppr_accents($word->scrabble_name).'.html" title="'.$word->scrabble_name.'" >'.$word->scrabble_name.'</a>'.' ('.$word->scrabble_points.' points),&nbsp; '; }
Merci pour votre aide.

Avatar du membre
Mammouth du PHP | 1609 Messages

09 juin 2019, 01:39

Salut Jefekoi, pour les anagrammes avec moins de lettres le problème c'est qu'avec le substr tu enlèves des lettres à harpes et donc tu testes arpes, rpes, pes, es alors qu'en fait tu as plus de possibilités. Par exemple si tu ne prends que trois lettres, vu que tu as 6 lettres au départ, tu as 6*5*4 combinaisons de lettres possibles, soit 120 combinaisons... bien entendu tu en as moins en considérant que tu ordonnes les lettres. Tu auras des combinaisons équivalentes. Par exemple har sera équivalent à hra, arh, ahr, rah, rha (6 pour 1). Peut être peux-t-on dans ce cas considérer que tu as 120 combinaisons divisé par 6 soit 120/6 = 20 combinaisons avec lettres ordonnées. L’algorithme pour récupérer ces combinaisons n'est pas aussi simple que ce substr.

Pour les anagrammes manquants par exemple phrase, alors que tu as bien phrasé, il faudrait que tu vérifies directement dans la base de données que tu as bien le mot et en vérifier le sorted_letters. Je pense en l’occurrence que tu n'as pas le mot phrase dans ta base mais uniquement le mot phrasé. Pareil pour harpes où tu as uniquement le mot harpés.

EDIT :
Bon ben j'avais envi de batailler sur cet algorithme alors voilà. ^^
Avec ça si j'ai pas fait d'erreur, tu vas pouvoir tester pour chaque combinaison unique de lettres si elle existe dans ton dictionnaire et ainsi retourner tous les mots possibles avec les lettres du mot donné. Tu pourrais même donner les 7 lettres de ta main (au scrabble) et obtenir tous les mots possibles.
$word = 'harpes';
$sortedLetters = Combination::sortLetters($word);

echo "For word <b>$word</b>, sorted letters: <b>$sortedLetters</b><br/>";

for ($length = strlen($word) - 1; $length > 1; $length--) {
  echo "<br/>Unique combinations with <b>$length</b> letters<br/>";
  $combination = new Combination($word, $length);

  $i = 0;
  while ($letters = $combination->next())
    echo str_pad(++$i, 2, 0, STR_PAD_LEFT)." - $letters<br/>";
}


class Combination {

  private $length ;
  private $max;
  private $letters;

  private $indexes = array();
  private $tabIndexes = array();

  public function __construct($letters, $max)
  {
    $this->length = strlen($letters);
    $this->max = $max;
    $this->letters = self::sortLetters($letters);
  }

  public static function sortLetters($letters)
  {
    $array = str_split($letters);
    sort($array);

    return implode('', $array);
  }

  public function next() {
    if (!count($this->indexes)) {
      for ($i = 0; $i < $this->max; $i++)
        $this->indexes[$i] = $i;

      return $this->getCombination();
    }

    for ($i = $this->max - 1; $i > -1; $i--) {
      if ($this->indexes[$i] + 1 < $this->length - ($this->max - $i - 1)) {
        $this->indexes[$i]++;

        if ($i + 1 < $this->max)
          for ($j = $i + 1; $j < $this->max; $j++)
            $this->indexes[$j] = $this->indexes[$j - 1] + 1;

        return $this->getCombination();
      }
    }

    return false;
  }

  public function getIndex()
  {
    return implode('', $this->indexes);
  }

  public function getCombination()
  {
    $this->tabIndexes[] = $this->getIndex();
    $combination = '';

    foreach ($this->indexes as $index)
      $combination.= $this->letters[$index];

    return $combination;
  }
}

Sortie :
For word harpes, sorted letters: aehprs

Unique combinations with 5 letters
01 - aehpr
02 - aehps
03 - aehrs
04 - aeprs
05 - ahprs
06 - ehprs

Unique combinations with 4 letters
01 - aehp
02 - aehr
03 - aehs
04 - aepr
05 - aeps
06 - aers
07 - ahpr
08 - ahps
09 - ahrs
10 - aprs
11 - ehpr
12 - ehps
13 - ehrs
14 - eprs
15 - hprs

Unique combinations with 3 letters
01 - aeh
02 - aep
03 - aer
04 - aes
05 - ahp
06 - ahr
07 - ahs
08 - apr
09 - aps
10 - ars
11 - ehp
12 - ehr
13 - ehs
14 - epr
15 - eps
16 - ers
17 - hpr
18 - hps
19 - hrs
20 - prs

Unique combinations with 2 letters
01 - ae
02 - ah
03 - ap
04 - ar
05 - as
06 - eh
07 - ep
08 - er
09 - es
10 - hp
11 - hr
12 - hs
13 - pr
14 - ps
15 - rs
Développeur web depuis + de 20 ans

Eléphant du PHP | 153 Messages

09 juin 2019, 09:29

Wouaaa tu m'impressionnes

J'ai essayé avec le mot "reprendre" et en cherchant dans la BD et voilà ce qu'il me donne (il y a des doubles ...) :)

J'ai juste une petite question la recherche dans la BD je l'ai mis sous ton :
echo str_pad(++$i, 2, 0, STR_PAD_LEFT)." - $letters<br/>";

en utilisant une function : C'est correct où peut mieux faire ?

Bon dimanche ;)
Et encore un Grand merci :)
Tu connais mon lien tu essai avec ça ==> p.php

Code : Tout sélectionner

function verifier($monmotNET) { require ('mysqli_conn.php'); $conn = new mysqli($servername, $username, $password, $dbname); $sorted_letters = $conn->real_escape_string(sort_alpha_noaccent_tolower($monmotNET));// l'anagramme unique de recherche $query = "SELECT * FROM dictionnaire WHERE sorted_letters = '$sorted_letters'";// sélectionne tous les mots du dictionnaire ayant cet anagramme unique $words = $conn->query($query); while ($word = $words->fetch_object()) { $nbrAna++; echo $word->scrabble_name.", "; } }

Code : Tout sélectionner

For word reprendre, sorted letters: deeenprrr Unique combinations with 8 letters éprendre, rependre, éprendre, rependre, éprendre, rependre, reperdre, Unique combinations with 7 letters repende, repende, repende, reperde, reperde, reperde, prendre, reprend, prendre, reprend, prendre, reprend, prendre, reprend, prendre, reprend, prendre, reprend, prendre, reprend, prendre, reprend, prendre, reprend, repérer, Unique combinations with 6 letters denrée, denrée, denrée, eprend, pendre, repend, eprend, pendre, repend, eprend, pendre, repend, rendre, rendre, rendre, perdre, reperd, perdre, reperd, perdre, reperd, eprend, pendre, repend, eprend, pendre, repend, eprend, pendre, repend, rendre, rendre, rendre, perdre, reperd, perdre, reperd, perdre, reperd, eprend, pendre, repend, eprend, pendre, repend, eprend, pendre, repend, rendre, rendre, rendre, perdre, reperd, perdre, reperd, perdre, reperd, repère, repère, repère, Unique combinations with 5 letters pende, rende, rende, rende, perde, perde, perde, pende, rende, rende, rende, perde, perde, perde, prend, prend, prend, pende, rende, rende, rende, perde, perde, perde, prend, prend, prend, prend, prend, prend, neper, neper, neper, perre, perre, perre, errer, neper, neper, neper, perre, perre, perre, errer, neper, neper, neper, perre, perre, perre, errer, Unique combinations with 4 letters éden, pede, éden, pede, pend, nerd, rend, nerd, rend, nerd, rend, perd, perd, perd, éden, pede, pend, nerd, rend, nerd, rend, nerd, rend, perd, perd, perd, pend, nerd, rend, nerd, rend, nerd, rend, perd, perd, perd, épée, nepe, pêne, nere, rêne, nere, rêne, nere, rêne, père, père, père, erré, réer, erré, réer, erré, réer, nepe, pêne, nere, rêne, nere, rêne, nere, rêne, père, père, père, erré, réer, erré, réer, erré, réer, nepe, pêne, nere, rêne, nere, rêne, nere, rêne, père, père, père, erré, réer, erré, réer, erré, réer, Unique combinations with 3 letters der, der, der, der, der, der, der, der, der, née, ère, réé, ère, réé, ère, réé, née, ère, réé, ère, réé, ère, réé, pré, pré, pré, née, ère, réé, ère, réé, ère, réé, pré, pré, pré, pré, pré, pré, Unique combinations with 2 letters dé, dé, dé, en, né, ré, ré, ré, en, né, ré, ré, ré, en, né, ré, ré, ré,

Avatar du membre
Mammouth du PHP | 1609 Messages

09 juin 2019, 11:59

Ok vu, ça marche très bien quand les lettres du mot n'ont qu'une occurrence mais ça crée des doublons quand des lettres ont plusieurs occurrence. Tout à fait logique, je vais t'arranger ça. ;)
Développeur web depuis + de 20 ans

Eléphant du PHP | 153 Messages

09 juin 2019, 12:18

Merci Saian,
Je comprend l'histoire des doubles si j'ai bien compris, il fait un array sur le mot puis prend lettre par lettre et les combines une après l'autre :)

Mille merci Saian ;)