Как взять одну запись из массива - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть функция, которая подсчитывает количество баллов за каждую букву. Я хочу, чтобы она подсчитывала очки за каждое слово. Смотри это мой код:

function getValue() {
    $letter = $this->getName(); // String from FORM

    // Switch looks at a letter and assigns the value points for that letter
    switch(true){
        case($letter == 'a'||$letter == 'e'||$letter == 'i'||$letter == 'o'||$letter == 'u'||$letter == 'l'||$letter == 'n'||$letter == 's'||$letter == 't'||$letter == 'r'):
            return 1;
        case($letter == 'd'||$letter == 'g'):
            return 2;
        case($letter == 'b'||$letter == 'c'||$letter == 'm'||$letter == 'p'):
            return 3;
        case($letter == 'f'||$letter == 'h'||$letter == 'v'||$letter == 'w'||$letter == 'y'):
            return 4;
        case($letter == 'k'):
            return 5;
        case($letter == 'j'||$letter == 'x'):
            return 8;
        case($letter == 'q'||$letter == 'z'):
            return 10;
        default:
            return 0;
    }
}
function makeWordsPoint() {
    $total_word_points = 0;
    $words = $this->word_for_letters;
    foreach ($words as $word) {

        $total_word_points = $word->getValue();
    }
    echo $word . "=" . $total_word_points
}

Как я могу это сделать? Спасибо за помощь

РЕДАКТИРОВАТЬ:

Окей, посмотрите сейчас. Есть мои два класса Word и Letter

<?php
    class Word
    {
        private $word;
        private $words_with_points = array();

        function __construct($user_letters)
        {
            $this->word = $user_letters;

            // creates array of object word for letters
            $this->word_for_letters = $this->makeWordForLetters();

            // creates array of letter objects for the word
            $this->words_with_points = $this->makeWordsWithPoints();

        }

        function makeWordForLetters()
        {
            $word_objects = array();
            $word = $this->getWord();
            $file = file_get_contents( __DIR__."/../src/dictionary.txt");
            $items = explode("\n", $file);

            $letters = str_split($word);

            foreach ($items as $item) {
                $list = $letters;
                // remove the original word (once)
                $thisItem = preg_replace("/$word/", '', $item, 1);
                for ($i = 0; $i < strlen($thisItem); $i++) {
                    $index = array_search($thisItem[$i], $list);

                    if ($index === false) {
                        continue 2; // letter not available
                    }

                    unset($list[$index]); // remove the letter from the list
                }

                array_push($word_objects, $item);
            }

            return $word_objects; // passed!

        }

        function makeWordsWithPoints()
        {
            $word = $this->makeWordForLetters();
            $letter_objects = array();

            foreach ($word as $character) {
                array_push($letter_objects, new Letter($character));
            }

            return $letter_objects;
        }

        function getWord()
        {
            return $this->word;
        }

        function getWordForLetters()
        {
            return $this->word_for_letters;
        }

        function getWordsWithPoints()
        {
            return $this->words_with_points;
        }

    }
 ?>
<?php
    class Letter
    {
        private $name;
        private $value;

        function __construct($letter)
        {
            $letter = strtolower($letter);
            $this->name = $letter;
            $this->value = $this->setValue();
        }

        function getName()
        {
            return $this->name;
        }

        function getValue()
        {
            return $this->value;
        }

        function setValue()
        {
            $letter = $this->getName();

            switch(true){
                case($letter == 'a'||$letter == 'e'||$letter == 'i'||$letter == 'o'||$letter == 'u'||$letter == 'l'||$letter == 'n'||$letter == 's'||$letter == 't'||$letter == 'r'):
                    return 1;
                case($letter == 'd'||$letter == 'g'):
                    return 2;
                case($letter == 'b'||$letter == 'c'||$letter == 'm'||$letter == 'p'):
                    return 3;
                case($letter == 'f'||$letter == 'h'||$letter == 'v'||$letter == 'w'||$letter == 'y'):
                    return 4;
                case($letter == 'k'):
                    return 5;
                case($letter == 'j'||$letter == 'x'):
                    return 8;
                case($letter == 'q'||$letter == 'z'):
                    return 10;
                default:
                    return 0;
            }
        }
    }
 ?>

И теперь, когда я пишу сейчас такие буквы, как это: loso function makeWordForLetters() Ищите в моем массиве слова правильно для этих букв, и я отображаю эти слова с баллами на makeWordsWithPoint, например:

l - 1
lo - 0
loo - 0
loos - 0
los - 0
oslo - 0
s - 1
solo - 0

Но, как вы можете видеть, оценка неверна, поскольку отображает результат для одной буквы, а не для слова.

Как можно Я решаю эту проблему?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Попробуйте этот код. Я думаю, что это чище.

<?php

// set the score of each char into array
const SCORES = [
    // 1
    'a'=> 1,
    'e' => 1,
    'i' => 1,
    'o' => 1,
    'u' => 1,
    'l' => 1,
    'n' => 1,
    's' => 1,
    't' => 1,
    'r' => 1,
    // 2
    'd'=> 2,
    'g'=> 2,
    // 3
    'b'=> 3,
    'c'=> 3,
    'm'=> 3,
    'p'=> 3,
    // 4
    'f'=> 4,
    'h'=> 4,
    'v'=> 4,
    'w'=> 4,
    'y'=> 4,
    // 5
    'k'=> 5,
    // 8
    'j'=> 8,
    'x'=> 8,
    // 10
    'q'=> 10,
    'z'=> 10,
];

$word = 'abcdef'; // get the string from the request here
# print_r($word);

$chars = str_split($word); // split string into array of chars
# print_r($chars);  

$scores = array_map(function($char) { // create a scores array that convert char into value
    return SCORES[strtolower($char)] ?? 0; // get the score of each char and set to the array, if not exist set to 0
}, $chars);
# print_r($scores);  

$totalScore = array_sum($scores); // get the sum of the scores

echo $word . "=" . $totalScore;

Дайте мне знать, если у вас есть какие-либо вопросы.

0 голосов
/ 14 февраля 2020

принять его как строку, затем использовать функцию preg_split, считать длину нового массива. Например:

$string="php教程#php入门:教程#字符串:多分隔符#字符串:拆分#数组";
$arr = preg_split("/(#|:)/",$string);
print_r($arr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...