2010-10-10 60 views
20

Có bất kỳ chức năng nào để phát hiện và mã hóa đệ quy mảng đa chiều trong PHP không?Implode và Explode Mảng đa chiều

+1

Tôi nghĩ các bạn đã nhảy súng. Câu hỏi bạn đánh dấu là câu trả lời không chính xác là câu trả lời cho câu hỏi này. Bạn nên đọc trước khi nhấn nút dupe đó. Nó không phải là khó. – Jeffz

+1

Câu hỏi này được đánh dấu không chính xác là bản sao của [implode-data-from-a-multi-dimensional-array] (http://stackoverflow.com/questions/16710800/implode-data-from-a-multi-dimensional- mảng). Câu hỏi này là về imploding/exploding nói chung trong khi câu hỏi còn lại là về imploding một khóa trong một mảng đa chiều. –

+0

json_encode/json_decode cũng là cách tốt để đóng gói, giải nén và lưu trữ các mảng đa chiều. json_encode có thể mã hóa các mảng như '['foo' => ['bar' => 1, 'baz' => [2,3]]]' và sẽ trả về một chuỗi như '{" foo ": {" bar ": 1, "baz": [2,3]}} '. json_decode sau đó có thể trả về chuỗi được mã hóa JSON làm đối tượng. Dữ liệu JSON có ích khi chuyển dữ liệu từ PHP sang Javascript dưới dạng JSON ('stdClass Object ([foo] => stdClass Object ...}'). –

Trả lời

43

Bạn có thể làm điều này bằng cách viết một hàm đệ quy:

function multi_implode($array, $glue) { 
    $ret = ''; 

    foreach ($array as $item) { 
     if (is_array($item)) { 
      $ret .= multi_implode($item, $glue) . $glue; 
     } else { 
      $ret .= $item . $glue; 
     } 
    } 

    $ret = substr($ret, 0, 0-strlen($glue)); 

    return $ret; 
} 

Đối với nổ, điều này là không thể, trừ khi bạn đưa ra một số loại cấu trúc chính thức đối với chuỗi, trong trường hợp bạn là vào lĩnh vực serialization , đối với các chức năng đã tồn tại: serialize, json_encode, http_build_query trong số các chức năng khác.

+4

Ah! Serialize là những gì tôi không biết tôi cần! – HyderA

+0

Bất kỳ cách nào để có nó chỉ implode một số cột bên trong mảng mảng? như thế này, nhưng chỉ in ra các trường db? –

2

Bạn có thể sử dụng array_walk_recursive để gọi hàm đã cho trên mọi giá trị trong mảng đệ quy. Làm thế nào mà chức năng trông giống như phụ thuộc vào dữ liệu thực tế và những gì bạn đang cố gắng làm.

2

Tôi đã tạo hai hàm đệ quy để kích hoạt và phát nổ. Kết quả của multi_explode có thể không hoạt động như mong đợi (các giá trị đều được lưu trữ ở cùng một cấp thứ nguyên).

function multi_implode(array $glues, array $array){ 
    $out = ""; 
    $g = array_shift($glues); 
    $c = count($array); 
    $i = 0; 
    foreach ($array as $val){ 
     if (is_array($val)){ 
      $out .= multi_implode($glues,$val); 
     } else { 
      $out .= (string)$val; 
     } 
     $i++; 
     if ($i<$c){ 
      $out .= $g; 
     } 
    } 
    return $out; 
} 
function multi_explode(array $delimiter,$string){ 
    $d = array_shift($delimiter); 
    if ($d!=NULL){ 
     $tmp = explode($d,$string); 
     foreach ($tmp as $key => $o){ 
      $out[$key] = multi_explode($delimiter,$o); 
     } 
    } else { 
     return $string; 
    } 
    return $out; 
} 

Để sử dụng chúng:

echo $s = multi_implode(
    array(';',',','-'), 
    array(
     'a', 
     array(10), 
     array(10,20), 
     array(
      10, 
      array('s','t'), 
      array('z','g') 
     ) 
    ) 
); 
$a= multi_explode(array(';',',','-'),$s); 
var_export($a);