Estoy intentando crear una función que devuelve el número de todos los únicos de casos insensibles Los caracteres que ocurren >= $n veces en una cadena dada.

Por ejemplo:

function getNumOfUniqueCharacters($str, $n) {
    // ...
}
getNumOfUniqueCharacters('A1B2C3', 2); // 0
getNumOfUniqueCharacters('A1a1C1', 2); 
// 2, because A and 1 both occur 2 or more times.
getNumOfUniqueCharacters('Alabama', 3); // 1

Hice esto:

function getNumOfUniqueCharacters($text)
{
    $ret = 0;
    $a = [];
    $t = str_split(strtolower($text));
    $l = count($t);
    for ($i = 0; $i < $l; $i++) {
        $c = $t[$i];
        if (array_key_exists($c, $t)) {
            if ($t[$c] === 1)
                $ret += 1;
            $t[$c] += 1;
        } else {
            $t[$c] = 1;
        }
    }
    return $ret;
}

Pero no funciona tan bien, necesito agregar el segundo argumento $n. ¿Cómo agregarlo correctamente?

1
Vladyslav 8 jun. 2021 a las 11:12

4 respuestas

La mejor respuesta

Espero tener tu pregunta correcta. Aquí está mi idea para este código:

<?php

$string = "A1B2C1A2b2b4b5";

function getNumOfUniqueCharacters($string, $n)
{
    $occurrenceArray = array();
    $text = str_split(strtolower($string));

    //put each character in a keyValue array and count them
    foreach($text as $character){
        if(!array_key_exists($character, $occurrenceArray)) $occurrenceArray[$character] = 1;
        else $occurrenceArray[$character]++;
    }

    //loop through keyValue array and remove everything that has value < $n
    foreach($occurrenceArray as $key => $value)
    {
        if($value < $n) unset($occurrenceArray[$key]);
    }

    //return array
    return $occurrenceArray;
}

print_r(getNumOfUniqueCharacters($string, 2));

Este código aquí imprimirá lo siguiente:

Array ( 
   [a] => 2 
   [1] => 2 
   [b] => 4 
   [2] => 3 )

Editar: Si necesita el conde de cuántos caracteres repiten más de $ N, simplemente puede reemplazar la devolución con return count($occurrenceArray);

1
Răzvan T. 8 jun. 2021 a las 08:36

Te he escrito una función con muchos comentarios para explicar el proceso de pensamiento,

function getNumOfUniqueCharacters($string, $n = null) {

  // Map all case-insensitive characters to an array
  $map = str_split(strtolower($string), 1);

  // Character registry
  $reg = array_count_values($map);

  // Filter out single occurances
  $reg = array_filter($reg, function($v){return $v > 1;});

  // Filter out less than $n occurances (if $n is not null)
  if (null !== $n) {
    $reg = array_filter($reg, function($v)use($n){return $v >= $n;});
  }

  // Return the number duplicate occurances (or more than n occurances)
  return count($reg);

}

Uso:

echo getNumOfUniqueCharacters('A1B2C3', 2) . PHP_EOL;
echo getNumOfUniqueCharacters('A1a1C1', 2) . PHP_EOL;
echo getNumOfUniqueCharacters('Alabama', 3) . PHP_EOL;
echo getNumOfUniqueCharacters('Mississippi') . PHP_EOL;

Salida:

0
2
1
3
0
Prof 8 jun. 2021 a las 09:12

Una solución alternativa podría ser usar array_count_values() y a foreach() para filtrar para $n ocurrencias de caracteres únicos en una cadena.

function getNumOfUniqueCharacters(string $str = '', int $n = 0): int
{
    $arr = str_split(strtolower($str)); // string to array of chars
    $unique = array_count_values($arr); // unique char => count
    foreach($unique as $char => $count) if($count < $n) unset($unique[$char]); // filter for $n
    return count($unique); // return count
}

Trabajando DEMO

0
jibsteroos 8 jun. 2021 a las 09:37

Esta tarea es bastante fácil, si usa funciones de matriz de PHP:

function getNumOfUniqueCharacters(string $string = '', int $n = 1): int {
    // Split the string by character and count the occurences of all values
    $counted = array_count_values(mb_str_split(mb_strtolower($str)));
    // Discard everything, that is does not match the $n parameter
    $counted = array_filter($counted, function($a) use($n) {
        return $a >= $n;
    });
    // Return the length of the remaining array
    return count($counted);
}

También tenga en cuenta que puede usar funciones MB_ *, por lo que su código funcionará con caracteres multibyte.

0
D B 8 jun. 2021 a las 12:01