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.