Я новичок в PHP, и у меня есть вопрос.

Я пытаюсь создать функцию, которая добавляет теги к тексту. Моя функция работает, но порядок тегов в возвращаемом массиве неправильный.

Как я могу изменить порядок, пожалуйста

Спасибо за любую помощь.

 <?php
    
     $tags = [
        'animals' => ['cat', 'dog', 'horse', 'ferret'],
        'nature' => ['walk', 'outdoor', 'tree', 'plant']];
        
        
        function getTags(string $text, array $tags): array
        {
            $lowerC = strtolower($text);
            $str = preg_replace("/[^A-Za-z\'\- ]/", '', $lowerC);
            $arrayT = explode(" ", $str);
        
            $tagArray = [];
            foreach ($tags as $tag => $value) {
                
                    if (array_intersect( $value, $arrayT )) {
                        $tagArray[] = $tag;
                }
        
            }   return $tagArray;
          
        }
    
    
    $res = getTags('During my walk, I met a white horse', $tags);
    var_dump($res); // returns ['animals', 'nature'] but I'm trying to get ['nature', 'animals']
php
2
Carrie Anne 13 Фев 2021 в 16:14

1 ответ

Лучший ответ

Если вы хотите сначала получить «природу», потому что «прогулка» стоит перед словом «лошадь», вам нужно сначала перебирать слова, а не теги.

$tags = [
    'animals' => ['cat', 'dog', 'horse', 'ferret'],
    'nature' => ['walk', 'outdoor', 'tree', 'plant'],
];
    
    
function getTags(string $text, array $tags): array
{
    $lowerC = strtolower($text);
    $str = preg_replace("/[^A-Za-z\'\- ]/", '', $lowerC);
    $arrayT = explode(" ", $str);

    $tagArray = [];
    foreach ($arrayT as $word) {
        // find tag for this word
        foreach ($tags as $cat => $values) {
            if (in_array($word, $values)) {
                // append the tag to the list
                $tagArray[] = $cat;
            }
        }
    }
    
    // remove duplicates
    return array_unique($tagArray);
  
}


$res = getTags('During my walk, I met a white horse', $tags);
var_dump($res);

Выход :

array(2) {
  [0]=>
  string(6) "nature"
  [1]=>
  string(7) "animals"
}

ИЗМЕНИТЬ

Как отметил @GeorgeGarchagudashvili, код можно оптимизировать, подготовив массив для сравнения. Вот способ:

function getTags(string $text, array $tags): array
{
    $lowerC = strtolower($text);
    $str = preg_replace("/[^A-Za-z\'\- ]/", '', $lowerC);
    $arrayT = explode(" ", $str);
    
    // Prepare tags for searching
    $searchTags = [];
    foreach ($tags as $cat => $values) {
        foreach ($values as $word) {
            $searchTags[$word] = $cat;
        }
    }

    $tagArray = [];
    foreach ($arrayT as $word) 
    {
        // find tag for this word
        if (isset($searchTags[$word])) 
        {
            // append the tag to the list
            $tagArray[] = $searchTags[$word];
        }
    }
    
    // remove duplicates
    return array_unique($tagArray);
  
}
0
Syscall 13 Фев 2021 в 15:09