2015-05-06 23 views
5

Ví dụ, nếu một ma trận là:tạo transpose ma trận sử dụng php

1 2 
3 4 
5 6 

Sau đó transpose của ma trận trên sẽ là:

1 3 5 
2 4 6 

Đây là mã hiện tại của tôi:

<?php 

    // transpose matrix 
    $trans = array(
     array(1, 2), 
     array(3, 4), 
     array(5, 6) 
    ); 

    foreach ($trans as $key => $val){ 
     foreach ($trans[$key] as $k => $v){ 
      echo $v; 
     } 
    } 

?> 

Trả lời

15

Có một cách PHP kỳ quặc để chuyển đổi mảng 2d:

$trans = array(
    array(1, 2), 
    array(3, 4), 
    array(5, 6) 
); 

array_unshift($trans, null); 
$trans = call_user_func_array('array_map', $trans); 
var_dump($trans); 

Demo

EDIT cách tiếp cận dễ dàng hơn sử dụng PHP 5.6 mảng giải nén

Với sự ra đời của các đối số mảng tính năng giải nén trong PHP 5.6, chúng ta có thể đơn giản hóa này vẫn tiếp tục:

$trans = array(
    array(1, 2), 
    array(3, 4), 
    array(5, 6) 
); 

$trans = array_map(null, ...$trans); 
var_dump($trans); 

EDIT Giải thích

Trích dẫn từ các tài liệu PHP cho array_map() function:

Một sử dụng thú vị của chức năng này là xây dựng một mảng của mảng, có thể dễ dàng thực hiện bằng cách sử dụng NULL như tên của hàm callback

(Xem Ví dụ # 4 từ đó trang tài liệu cho một ví dụ về điều này không)

các array_unshift($trans, null) mà chúng ta thực hiện lần đầu tiên được cung cấp rằng NULL gọi lại, và chúng tôi sử dụng call_user_func_array() vì chúng tôi không nhất thiết phải biết có bao nhiêu giá trị trong mảng $trans của chúng tôi. Những gì chúng ta đang làm sử dụng mà call_user_func_array() là tương đương với:

$trans = array_map(NULL, $trans[0], $trans[1], $trans[2]); 

ví dụ mảng của bạn, bởi vì cấp cao nhất của 2-d mảng của bạn có ba yếu tố (phím 0, 1 và 2).

hiệu quả, NULL callback này vòng qua tất cả các mảng song song dùng mỗi giá trị từ họ lần lượt để xây dựng một mảng mới:

$maxArraySize = max(count($array[0], $array[1], $array[2]); 
// $maxArraySize will have a value of 2 in your case, 
//  because your sub-arrays are all equal size 
$newArray = []; 
for($i = 0; $i < $maxArraySize; ++$i) { 
    $tmpArray = []; 
    $tmpArray[] = $array[0][$i]; 
    $tmpArray[] = $array[1][$i]; 
    $tmpArray[] = $array[2][$i]; 
    $newArray[] = $tmpArray[]; 
} 

Có một vài kiểm tra thêm ở đó

  • nó không quan tâm nếu mảng của bạn được kết hợp hoặc liệt kê trong cả hai chiều, bởi vì nó truy cập phần tử thứ $i, không phải chỉ mục
  • Nếu các mảng phụ không có cùng chiều dài, thì nó sẽ bị ảnh hưởng ctively miếng tiểu mảng ngắn hơn với các giá trị null để phù hợp với chiều dài dài nhất
  • Nó không quan trọng bao nhiêu mảng bạn vượt qua trong, nó sẽ làm việc với tất cả chúng song song
+0

cảm ơn bạn, đó là công việc :) –

+1

Tôi nghĩ rằng một lời giải thích những gì mã này không, có thể là thú vị cho OP và SO khách truy cập trong tương lai :) Ví dụ những gì 'array_unshift()' và 'NULL' làm việc với chữ ký' array_map() '. Và những gì có thể giúp hiểu những gì đang xảy ra ở đây, sẽ là thêm "phiên bản tĩnh" của mã này. – Rizier123

+0

Bây giờ tôi sẽ nói đó là một lời giải thích ** tốt **! Và một câu trả lời rất hay. – Rizier123

Các vấn đề liên quan