PHP взрывается и назначает его многомерному массиву

Я хочу взорвать строку два раза и сделать многомерный массив.

$data = "i love funny movies \n i love stackoverflow dot com \n i like rock song";
$data = explode("\n", $data);

так что print_r($data); выведет:

Array
(
 [0] => i love funny movies 
 [1] => i love stackoverflow com 
 [2] => i like rock song
)

теперь, если я сделаю так:

$line_data = explode(" ", $data); // explode $data variable by spaces.

a print_r($line_data); даст мне следующее:

Array
(
 [0] => i
 [1] => love
 [2] => funny
 [3] => movies
 [4] => 
 [5] => i
 [6] => love
 [7] => stackoverflow
 [8] => dot
 [9] => com
 [10] => 
 [11] => i
 [12] => like
 [13] => rock
 [14] => song
)

но то, что я хочу достичь, будет выглядеть следующим образом:

Array
(
 [0][0] => i
 [0][1] => love
 [0][2] => funny
 [0][3] => movies
 [0][4] => 
 [1][5] => i
 [1][6] => love
 [1][7] => stackoverflow
 [1][8] => dot
 [1][9] => com
 [1][10] => 
 [2][11] => i
 [2][12] => like
 [2][13] => rock
 [2][14] => song
)

здесь первый индекс должен представлять номер строки, а второй индекс будет представлять номер слова. Как взорвать строку, чтобы иметь такой массив?

6 ответов

Сделайте это:

$data = "i love funny movies \n i love stackoverflow dot com \n i like rock song";
$data = explode(" \n ", $data);
$out = array();
$step = 0;
$last = count($data);
$last--;
foreach($data as $key=>$item){
 foreach(explode(' ',$item) as $value){
 $out[$key][$step++] = $value;
 }
 if ($key!=$last){
 $out[$key][$step++] = ' '; // not inserting last "space"
 }
}
print '<pre class="prettyprint linenums">';
print_r($out);
print '
';

OUTPUT (что вам нужно):

Array
(
 [0] => Array
 (
 [0] => i
 [1] => love
 [2] => funny
 [3] => movies
 [4] => 
 )
[1] => Array
 (
 [5] => i
 [6] => love
 [7] => stackoverflow
 [8] => dot
 [9] => com
 [10] => 
 )
[2] => Array
 (
 [11] => i
 [12] => like
 [13] => rock
 [14] => song
 )
)


Сначала explode строка по новой строке. Теперь у вас есть массив. Итерации над значениями этого массива и explode каждое значение по пробелу. Следующий код выполняет именно это:

$data = "i love funny movies \n i love stackoverflow dot com \n i like rock song";
$data = explode("\n ", $data);
$num = 0;
foreach($data as &$val){
$exp = explode(" ", $val);
$val = array_combine(range($num, $num+sizeof($exp)-1), $exp);
$num += sizeof($exp);
}
print_r($data);

Альтернативное решение с array_search и array_slice:

$data = "i love funny movies \n i love stackoverflow dot com \n i like rock song";
$data = explode(" ", $data);
$arr = array();
while($search = array_search("\n", array_values($data))){
$arr[] = array_merge(array_slice($data, 0, $search, true), array(""));
$data = array_slice($data, $search+1, null, true);
}
$data = array_merge($arr, array($data));
print_r($data);

Выход будет:

Array
(
 [0] => Array
 (
 [0] => i
 [1] => love
 [2] => funny
 [3] => movies
 [4] => 
 )
 [1] => Array
 (
 [5] => i
 [6] => love
 [7] => stackoverflow
 [8] => dot
 [9] => com
 [10] => 
 )
 [2] => Array
 (
 [11] => i
 [12] => like
 [13] => rock
 [14] => song
 )
)


Try

$data = "i love funny movies \n i love stackoverflow dot com \n i like rock song";
$data = explode("\n", $data);
for($i=0;$i
<p>demo <a href="https://eval.in/96453" rel="nofollow noreferrer" target="_blank">здесь</a></p>


$line_data = array();
foreach($data as $key => $d){
 $line_data[$key] = explode(' ', $d);
}


Вы можете использовать это решение без использования взрыва:

$data = "i love funny movies \n i love stackoverflow dot com \n i like rock song";
 $line_data = explode(" ", $data);
 $arrayLines = [];
 for($i = 0, $j = 0; $i < count($line_data); $i++) {
 if($line_data[$i] != "\n") {
 $arrayLines[$j][$i] = $line_data[$i];
 } else {
 $arrayLines[$j][$i] = $line_data[$i];
 $j++;
 }
 }
 print_r($arrayLines);


Если вам это нравится быстро и грязно:

foreach($data = explode("\n",$data) as &$d) {
 $d = explode(' ',$d);
}

licensed under cc by-sa 3.0 with attribution.