У меня есть такая строка:

$string = Leader,Brian; Elder,Nina,Maria; Member,Duke,Rai,Mike

Что я сделал:

$explode = ("; ", $string);

Тогда это будет выглядеть так:

Array ([0] => Leader,Brian [1] => Elder,Nina,Maria [2] => Member,Duke,Rai,Mike)

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

Array ([Leader] => Brian [Elder] => Array ([0] => Nina [1] => Maria) 
       [Member] => Array ([0] => Duke [1] => Rai [2] => Mike))

Как показать это в табличном теге html вот так?

Leader  |  Brian
Elder   |  Nina
        |  Maria
Member  |  Duke
        |  Rai
        |  Mike 

NB: вы можете изменить разделитель в строке, если с таким разделителем сложно

3
Stfvns 11 Май 2016 в 16:37

5 ответов

Лучший ответ

Вы explode - хороший первый шаг.

Следующий - повторить результат и снова взорвать его. Затем (в том же цикле) используйте первый элемент результата второго explode как ключ, а остальные как значение.

$string = "Leader,Brian; Elder,Nina,Maria; Member,Duke,Rai,Mike";

$exploded = explode("; ", $string);

foreach($exploded as $element) {
    $arr = explode(',', $element);

    $result[array_shift($arr)] = $arr;
}

var_dump($result);

Результат:

array(3) {
  ["Leader"]=>
  array(1) {
    [0]=>
    string(5) "Brian"
  }
  ["Elder"]=>
  array(2) {
    [0]=>
    string(4) "Nina"
    [1]=>
    string(5) "Maria"
  }
  ["Member"]=>
  array(3) {
    [0]=>
    string(4) "Duke"
    [1]=>
    string(3) "Rai"
    [2]=>
    string(4) "Mike"
  }
}
3
Jakub Matczak 11 Май 2016 в 13:51

Я бы, вероятно, прошел по массиву после разделения строки и снова разделил:

$list = explode("; ", $string);
array_walk($list, function(&$element) {
    $names = explode(',', $element);
    // Take the first item off the array type
    $type = array_shift($names);
    // Alter the array in-place to create the sub-array
    $element = [$type => $names]
});
1
Matt S 11 Май 2016 в 13:45

Вам нужно два "взрыва"

$string = 'Leader,Brian; Elder,Nina,Maria; Member,Duke,Rai,Mike';
$explode = explode("; ", $string);
foreach($explode as $row){
    $explode2 = explode(",", $row);
    foreach($explode2 as $i=>$p ){

        echo ( $i > 0 )?"\n\t|":"\n";
        echo $p;
    }
}
0
cmnardi 11 Май 2016 в 13:47

Это должно сделать это:

<?php
$string = 'Leader,Brian; Elder,Nina,Maria; Member,Duke,Rai,Mike';

$explode = array_map(function($v){return explode(',', $v);}, explode(';', $string));

$new_array = [];

foreach($explode as $k=>$v)
{
    $v[0] = trim($v[0]);

    $new_array[$v[0]] = $v;

    unset($new_array[$v[0]][0]);

    $new_array[$v[0]] = array_values($new_array[$v[0]]);
}

print_r($new_array);
0
MonkeyZeus 11 Май 2016 в 13:53

Вам нужно дважды взорваться - на ваших двух разделителях, например:

<?php
$string = "Leader,Brian; Elder,Nina,Maria; Member,Duke,Rai,Mike";

$result = array();
$parts = explode(";", $string);

foreach ($parts as $part)
{
    $kv = explode(",", $part);
    $result[array_shift($kv)] = $kv;
}

// result:
echo '<pre>';
print_r($result);
echo '</pre>';
?>

Дам тебе:

Array
(
    [Leader] => Brian
    [Elder] => Nina
    [Member] => Duke
)
0
Stuart 11 Май 2016 в 13:55