2012-06-14 4 views
17

Я новичок в PHP и не совсем понимаю, как это работает. Если у меня есть двумерный массив как таковой (возвращаемый в базу данных):Самый простой способ взорвать() двумерный массив?

array(3) { 
    [0]=> array(1) {   
     ["tag_id"]=> string(1) "5" 
    } 
    [1]=> array(1) {   
     ["tag_id"]=> string(1) "3" 
    } 
    [2]=> array(1) {   
     ["tag_id"]=> string(1) "4" 
    } 
} 

и хотите, чтобы превратить его в строку 5,3,4, что будет самый быстрый способ сделать это сделать? У меня в настоящее время есть неприятный цикл foreach, но надеялся, что это можно сделать в одной строке. Стандарт implode дает мне Array,Array,Array.

+3

Вы можете удалить все разрывы строк в вашем файле 'foreach'. –

+0

Я пытаюсь сказать, что вам все равно, если что-то использует пару строк. –

+1

@ Xeon06 Хотя я согласен принципиально, я хотел бы посмотреть, есть ли отличный способ сделать это лучше. Половина этого проекта - обучение, другая половина - фактическое кодирование. (Еще лучше, я мог бы удалить все разрывы строк и сказать моему боссу, что для этого кода нужен только один слой) – SomeKittens

ответ

23

Это изменяет массив, используя array_map, но, возможно, к лучшему, превратив его в 1D-массив tag_id. Тогда вы можете просто использовать лопаются как нормальный:

$arr = array_map(function($el){ return $el['tag_id']; }, $arr); 
$str = implode(',', $arr); 

Если вы не хотите изменить массив, чем вы можете просто сделать это:

$str = implode(',', array_map(function($el){ return $el['tag_id']; }, $arr)); 

Codepad Demo

+1

Ну, вы можете фактически передать результат 'array_map' прямо на вызов' implode'.) – raina77ow

+0

@ raina77ow Да, но я думаю, что было бы лучше изменить исходный массив, поскольку дополнительное измерение кажется бесполезным. Я уточню свой ответ, хотя :) – Paulpro

1

Заканчивать ниже от PHP implode() manual:

<?php 
/** 
* Implode an array with the key and value pair giving 
* a glue, a separator between pairs and the array 
* to implode. 
* @param string $glue The glue between key and value 
* @param string $separator Separator between pairs 
* @param array $array The array to implode 
* @return string The imploded array 
*/ 
function array_implode($glue, $separator, $array) { 
    if (! is_array($array)) return $array; 
    $string = array(); 
    foreach ($array as $key => $val) { 
     if (is_array($val)) 
      $val = implode(',', $val); 
     $string[] = "{$key}{$glue}{$val}"; 

    } 
    return implode($separator, $string); 

} 
?> 

Если вы хотите, чтобы вернуть значение (а не ключ), просто изменить выше, чтобы использовать $string[] = "{$val}";.

6

Вы просили два -мерный массив, вот функция, которая будет работать для многомерного массива.

function implode_r($g, $p) { 
    return is_array($p) ? 
      implode($g, array_map(__FUNCTION__, array_fill(0, count($p), $g), $p)) : 
      $p; 
} 

можно сгладить структуру массива следующим образом:

$multidimensional_array = array(
    'This', 
    array(
     'is', 
     array(
      'a', 
      'test' 
     ), 
     array(
      'for', 
      'multidimensional', 
      array(
       'array' 
      ) 
     ) 
    ) 
); 

echo implode_r(',', $multidimensional_array); 

Результаты является:

This,is,a,test,for,multidimensional,array 
0
function recursive_implode($connector=',', $array=[], $implod='keys'){ 

    if($implod=='keys'){ 

     $results=implode($connector,array_keys($array)); 
    } 
    else{ 

     $results=implode($connector,$array); 
    } 

    foreach($array as $key=> $value){ 

     if(is_array($value)){ 

      $results.=$connector.recursive_implode($connector,$value,$implod); 
     } 
    } 

    return $results; 
} 
2

Одна из командной строки

implode(',', array_map('implode', $arr, array_fill(0, count($arr), ''))) 
4
// simplest 
$str = implode(',',array_map('implode',$arr)); 
2

Если один просто хочет взрывать один массив «столбец», как в данном случае, то самое простое, что нужно сделать, это:

implode(",", array_column($array,"tag_id")); 
Смежные вопросы