Executando verificação de segurança...
4

Listar itens em um paragrafo com php [pedido suporte]

Olá!

Estou precisando colocar uma lista de nomes em um para grafo do tipo:
... composto por: Ngoma Fortuna, Douglas Silvestrini, Hugo Kotsubo.

, Douglas Silvestrini, Hugo Kotsubo.
são só uns individuos interessantes que achei aqui no tabnews 🤩️.

A linguagem em uso é PHP, crie uma solução (a baixo), mas gostaria de um contributo para melhora-lo e principalmente gostava de ajuda com a inclusão de funções nativas da linguagem.

O desafio é colocar os nomes em linha um após o outro, separados por "vírgula" e na final colocar "ponto".

Ah os nomes são dados em formato de objecto ou array.


<?php

# dados:

$children = (object) [
    'son5' => 'Celma', 
    'son4' => 'Zany', 
    'son3' => 'Albertina', 
    'son2' => 'Lucrêcia'
];

# ou:

$son = [
    'son' => 'Hermenegildo'
]; 


# Minha solução:

    function listInLine($list): string {
        if(!is_array($list)) $list = (array)$list;

        $line = ''; $counter = 0;
        foreach($list as $item) {
            if(count($list) <= 1) return "{$item}.";
            $line .= ($counter < count($list) - 1)? "{$item}, ": "{$item}.";

            $counter++;
        }

        return $line;
    }

Exemplo de uso:

<p>... composto por <?= listInLine($children) ?></p>
<p>... composto por <?= listInLine($son) ?></p>

Resultado:

<p>... composto por Celma, Zany, Albertina, Lucrêcia.</p>
<p>... composto por Hermenegildo.</p>

Abraços...

Carregando publicação patrocinada...
5

ajuda com a inclusão de funções nativas da linguagem

Você pode usar a função implode, que serve justamente para juntar elementos de um array. Esta função também já trata do caso em que tem apenas um elemento.

Depois, basta concatenar o resultado com o ponto:

function listInLine($list): string {
    if(!is_array($list)) $list = (array)$list;
    return implode(', ', $list). '.';
}
3

Exato! Poderia tipar a entrada da função como array também, já eliminaria essa verificação.

function listInLine(array $list = []): string {
    return is_null($list) ? '' : implode(', ', $list). '.';
}
1

Ilustre Douglas Silvestrini ou simplesmente sivestrini neste ponto:

Ah os nomes são dados em formato de objecto ou array

Falo que dados podem ser fornecidas como listas de dois formatos.

Será que teria como validar nos parametros dois formato? (reduziria muito mais a função)

2

Verdade, esqueci do objeto. Como você fez um type cast do array transformando-o em objeto, ele vai ser do tipo stdClass, então dá pra tipar também.

function listInLine(stdClass|array $list): string {
    // força a ser array
    $list = (array) $list;
    return is_null($list) ? '' : implode(', ', $list). '.';
}
2

Uau! Agora minha sonhada função (acredito que vou preferir usá-la como uma class) está completa. Valeu de coração Sivestrini.

2

Viva viva! kht ou "Hugo Kotsubo", desde já muito obrigado pelo teu valioso contributo, ainda não estou acreditando dava para reduzir as minhas mais de 10 linhas em apenas 3 😂.

Estou correndo para testar...

2

Viva esse emplode é uma beleza, funciona que é uma beleza 🤩️ ...
Ainda estou estudando a mágica, tanto em array de um só item como de mais de um funciona maravilhosamente...

valeukht