PHP: элементы с и без ключей явных один и тот же массив


Я пытаюсь выяснить, лучше или чище, чтобы сделать что-то подобное в PHP:

// Isto será passado como argumento de uma função...
$params = array('Nome', 'Idade', 'Mail' => '[email protected]');

"Имя" и "Возраст" указаны значения ключей назначается автоматически (например, 0 и 1, например), и "Почта" ключ, значение "[email protected]":

[0] => 'Nome',
[1] => 'Idade',
['Mail'] => '[email protected]'

Когда я шаг это цикл "foreach", я делаю это, чтобы иметь "Имя" и "Возраст", так как параметры по сути:

foreach ($params as $k => $i) {

    // Esta é a parte "feia"!
    if (is_int($k)) {
        $k = $i;
        $i = false;
    }

    // Para fazer algo assim, por exemplo...
    $out = "";
    if ($i) {
        $out .= "<p><a href=\"mailto:$i\">$k</a></p>\n";
    } else {
        $out .= "<p>$k<p>\n";
    }

}

, который будет возвращать что-то вроде:

<p>Name</p>
<p>Age</p>
<p><a href="mailto:[email protected]">Mail</a></p>

вопрос В том: есть чисто PHP дифференцировать элементы того же массива, которые имеют ключ явное (Mail => [email protected]), не имеющих (Имя и Возраст)?

Примечание: приведенный выше код был разделен на два этапа, чтобы лучше понять текущее решение, которое отличает значение ключа тестирование, если он является integer, но код, который я использую на самом деле:

$o = "";
foreach ($params as $k => $i) {
    if (!is_int($k)) {
        $o .= "<p><a href=\"$i\">$k</a></p>\n";
    } else {
        $o .= "<p>$i</p>\n";
    }
}
 5
Author: gmsantos, 2014-07-31

2 answers

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

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

add_table_row(['Nome', 'Idade', 'Mail' => '[email protected]']);

...

add_table_row(array('Nome', 'Idade', 'Mail' => '[email protected]'));

Однако, как я выяснила, существует ли способ передать переменное количество аргументов функции, с помощью функции "func_get_args()", и вызов функции, может стать еще более читаемым:

// PHP >= 5.4
add_table_row('Nome', 'Idade', ['Mail' => '[email protected]']);

И

add_table_row('Nome', 'Idade', array('Mail' => '[email protected]'));

Таким образом, например, полный код функции будет выглядеть так:

function add_table_row() {
    $args = func_get_args(); // retorna uma array de argumentos...
    $o = "<tr>\n";
    foreach ($args as $value) {
        if (is_array($value)) {       // Se o argumento é uma array...
            $cont = key($value);      // O dado da célula é a chave...
            $param = current($value); // E o parâmetro da tag é o valor...
            $o .= "<td $param>$cont</td>\n";
        } else {
            $o .= "<td>$value</td>\n";
        }
    }
    $o .= "</tr>\n";
    return $o;
}

Надеюсь, что это полезно кому-либо еще.

 4
Author: Blau, 2014-08-02 21:00:21

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

add_table_row('Nome,Idade,Mail:[email protected]')

    function add_table_row( $string )
    {
        $string = explode( ',' , $string );

        foreach( $string as $line )
        {
            if( strpos( $line , ':' ) && $elementos = explode( ':' , $line ) )
            {
                echo $elementos[0] . ', ' . $elementos[1];
            }
            else
            {
                echo $line;
            }
        }
    }

Output
Имя
Возраст -
Почта [email protected]

 0
Author: Papa Charlie, 2014-07-31 20:26:23