2015-09-30 2 views
0

У меня есть массив, который имеет несколько массивов внутри подобных. Вот как это выглядит:Как я могу вставить() многомерный массив в строку?

Array (
    [0] => Array (
     [0] => s1 
     [1] => s2 
     [2] => s5 
     [3] => s1 
     [4] => s25 
     [5] => s1 
     [6] => s6 
     [7] => s6 
     [8] => s1 
    ) 
    [2] => Array (
     [0] => a2 
     [1] => a1 
     [2] => a4 
    ) 
    [3] => Array () 
    [4] => Array () 
) 

То, что я пытаюсь выяснить, как я могу превратить эти нескольких массивов в 1 строку, где находится имеет значение из всех массивов разделены запятыми $values = "s1,s2,s5.."

я использовал impode() до этого, но с этим типом массива, он не работает. Другая проблема в этом - это пустые массивы, которые, я считаю, можно удалить с помощью array_filter().

$destination_array = array_filter($tags_list); 
$destination_array = implode(",", $tags_list); 
print_r($destination_array); 
+0

Показать ваш текущий код с 'implode()' и 'array_filter()', I gues s вы недалеко от решения :) – Rizier123

+0

@ Rizier123 Вопрос обновлен, спасибо. – aqq

ответ

2

У вас есть двумерный массив здесь. И ни implode(), ни array_filter() работают с многомерными массивами.

Это означает, что вы отфильтрованы все пустые значения из первого измерения, а также попытаться лопаются первое измерение:

Array (
     [0] => Array (
      [0] => s1 
      [1] => s2 
      [2] => s5 
      [3] => s1 
      [4] => s25 
      [5] => s1 
      [6] => s6 
      [7] => s6 
      [8] => s1 
     ) 
     [2] => Array (
      [0] => a2 
      [1] => a1 
      [2] => a4 
     ) 
     [3] => Array () 
     [4] => Array () 
     ↑ Filter first dimension and implode it 
    ) 

Так, очевидно, что вы должны сделать, вы должны фильтровать каждый подмассив. Затем взорвите каждый subArray и снова соедините все строки.

Как мы можем это сделать? Просто используйте array_map().

С помощью array_map() вы просматриваете каждый subArray и сначала фильтруете все пустые значения с помощью array_filter(). Затем вы добавляете implode() к каждому подматрице в строку. После этого вы будете в конечном итоге с массивом, как это:

Array 
(
    [0] => s1,s2,s5,s1,s25,s1,s6,s6,s1 
    [2] => a2,a1,a4 
) 

И тогда вам придется взрывать его снова, чтобы получить 1 строку из него.

Код:

echo implode(",", array_filter(array_map(function($v){ 
     return implode(",", array_filter($v)); 
    }, $array))); 

выход:

s1,s2,s5,s1,s25,s1,s6,s6,s1,a2,a1,a4 
+1

вы никогда не захотите сделать это простым путем;) –

+1

@Dagon Это простой способ. (btw, забыли фильтровать массив в вашем ответе, * быстро исправить его * :) – Rizier123

+0

Это отлично работает, спасибо за подробный ответ. – aqq

0

Я думаю, что это будет работать:

$str=''; 
foreach($array as $k=>$v){ 
    if(is_array($v)){ 
     $str.=implode(',',$v); 
    } 
} 
0

Желаемый результат может быть достигнут ряд способов (помимо функции подхода Rizier, который является хорошим и чистым):

Demo

Способ № 1: сверление/петля/быстрый способ

$array=[['s1','s2','s5','s1','s25','s1','s6','s6','s1'],2=>['a2','a1','a4'],[],[]]; 
$result=[]; 
foreach($array as $subarray){ 
    if(!empty($subarray)){ 
     $result[].=implode(',',$subarray); 
    } 
} 
echo implode(',',$result); 

Способ № 2: удобная "Leafnode" граббер

array_walk_recursive($array,function($v){static $first; echo $first.$v; $first=',';}); 

Способ № 3: медленный, неортодоксальные регулярное выражение способ

echo implode(',',preg_match_all('/[a-z]\d+/',json_encode($array),$out)?$out[0]:[]); 

Выходы:

s1,s2,s5,s1,s25,s1,s6,s6,s1,a2,a1,a4 

--- 

s1,s2,s5,s1,s25,s1,s6,s6,s1,a2,a1,a4 

--- 

s1,s2,s5,s1,s25,s1,s6,s6,s1,a2,a1,a4 
Смежные вопросы