2012-06-14 95 views
17

Sono nuovo di PHP e non ho abbastanza controllo su come funziona. Se ho una matrice bidimensionale in quanto tale (restituito da un database):Il modo più semplice per implodere() un array bidimensionale?

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" 
    } 
} 

e voglio trasformarlo in stringa 5,3,4 quale sarebbe il modo più rapido non fare questo? Al momento ho un odioso ciclo foreach, ma speravo che potesse essere fatto in una riga. Uno standard implode mi dà Array,Array,Array.

+3

è possibile rimuovere tutte le interruzioni di riga nel 'foreach'. –

+0

Quello che sto cercando di dire è che non ti importa se qualcosa usa un paio di righe. –

+1

@ Xeon06 Mentre sono d'accordo sul principio, mi piacerebbe vedere se c'è un modo elegante per farlo meglio. La metà di questo progetto è l'apprendimento, l'altra metà è la vera codifica. (Ancora meglio, potrei rimuovere tutte le interruzioni di riga e dire al mio capo che il codice aveva solo bisogno di una sola riga) – SomeKittens

risposta

23

Questo modifica l'array utilizzando array_map, ma probabilmente per il meglio trasformandolo in un array 1D di tag_id. Poi si può semplicemente utilizzare implodere come normale:

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

Se non si desidera modificare l'array di quanto si può solo fare questo:

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

Codepad Demo

+1

Bene, puoi effettivamente passare il risultato di 'array_map' a destra nella chiamata' implode'.) – raina77ow

+0

@ raina77ow Sì, ma penso che potrebbe essere meglio modificare l'array originale poiché la dimensione extra sembra inutile. Aggiornerò la mia risposta però :) – Paulpro

1

Partenza il seguito dalla 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); 

} 
?> 

Se si desidera solo restituire il valore (e non la chiave), basta modificare il sopra per usare $string[] = "{$val}";.

6

hai chiesto per due -array dimensionale, ecco una funzione che funzionerà per array multidimensionale.

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

posso appiattire una struttura a matrice in questo modo:

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

echo implode_r(',', $multidimensional_array); 

I risultati sono:

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

Un comando linea

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

Se si vuole semplicemente implodere un singolo array "colonna" come in questo caso, quindi la cosa più semplice da fare è:

implode(",", array_column($array,"tag_id")); 
Problemi correlati