2012-06-14 39 views
17

Tôi là người mới sử dụng PHP và không hiểu rõ cách hoạt động của PHP. Nếu tôi có một mảng hai chiều như vậy (được trả về bởi một cơ sở dữ liệu):Cách dễ nhất để implode() một mảng hai chiều?

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

và muốn biến nó thành chuỗi 5,3,4 gì sẽ là cách nhanh nhất làm làm điều này? Tôi hiện đang có một vòng lặp foreach đáng ghét, nhưng hy vọng nó có thể được thực hiện trong một dòng. Một tiêu chuẩn implode cho tôi Array,Array,Array.

+3

Bạn có thể loại bỏ tất cả các ngắt dòng trong 'foreach' của bạn. –

+0

Những gì tôi đang cố gắng nói là bạn không nên quan tâm nếu một cái gì đó sử dụng một vài dòng. –

+1

@ Xeon06 Trong khi tôi đồng ý về nguyên tắc, tôi muốn xem có cách nào tiện lợi để làm tốt hơn không. Một nửa của dự án này là học tập, một nửa khác là mã hóa thực tế. (Thậm chí tốt hơn, tôi có thể loại bỏ tất cả các ngắt dòng và nói với ông chủ của tôi rằng mã chỉ cần một lớp lót) – SomeKittens

Trả lời

23

Điều này sửa đổi mảng của bạn bằng cách sử dụng array_map, nhưng có thể tốt hơn bằng cách biến nó thành mảng 1D của tag_id. Sau đó, bạn chỉ có thể sử dụng nổ tung như bình thường:

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

Nếu bạn không muốn thay đổi mảng của bạn hơn bạn chỉ có thể làm điều này:

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

Codepad Demo

+1

Vâng, bạn thực sự có thể chuyển kết quả của 'array_map' ngay vào cuộc gọi' implode'.) – raina77ow

+0

@ raina77ow Có, nhưng tôi nghĩ có thể tốt hơn khi sửa đổi mảng gốc vì kích thước phụ có vẻ vô dụng. Tôi sẽ cập nhật câu trả lời của tôi mặc dù :) – Paulpro

1

Kiểm tra dưới đây từ 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); 

} 
?> 

Nếu bạn chỉ muốn trả về giá trị (và không phải là chìa khóa), chỉ cần thay đổi trên để sử dụng $string[] = "{$val}";.

6

Bạn hỏi cho một hai mảng hai chiều, đây là một hàm sẽ làm việc cho mảng đa chiều.

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

tôi có thể san bằng một cấu trúc mảng như vậy:

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

echo implode_r(',', $multidimensional_array); 

Kết quả là:

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

Một dòng lệnh

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

Nếu một chỉ đơn giản muốn nổ tung một mảng duy nhất "cột" như trong trường hợp này, thì điều đơn giản nhất để làm là:

implode(",", array_column($array,"tag_id")); 
Các vấn đề liên quan