2009-09-29 27 views
14

Tôi có một mảng của mảng, với cấu trúc sau:Có chức năng trích xuất 'cột' từ một mảng trong PHP không?

array(array('page' => 'page1', 'name' => 'pagename1') 
     array('page' => 'page2', 'name' => 'pagename2') 
     array('page' => 'page3', 'name' => 'pagename3')) 

Có một chức năng được xây dựng trong đó sẽ trả về một mảng mới chỉ với các giá trị của 'tên' phím? vì vậy tôi nhận được:

array('pagename1', 'pagename2', 'pagename3') 
+1

24 giờ? Con đường quá sớm. Đợi 48 giờ. Điều đó tốt cho việc một số câu trả lời tạo thêm nhiều phiếu bầu hơn và mở ra một số câu trả lời phù hợp hơn. – random

+0

Tôi không có ý nói âm thanh như giật, nhưng đây không phải là một câu hỏi phức tạp mà trong một vài ngày sẽ tiết lộ một giải pháp tuyệt vời. – fuentesjr

Trả lời

17

Tại sao phải có chức năng tích hợp? Không, không có, viết của riêng bạn.

Đây là một hình ảnh đẹp và dễ dàng, trái ngược với những người khác trong chuỗi này.

$namearray = array(); 

foreach ($array as $item) { 
    $namearray[] = $item['name']; 
} 
+1

Được rồi, cho chỉnh sửa gần đây của bạn ('dễ dàng, như Nếu bạn chuyển mã của bạn thành một chức năng thực sự theo yêu cầu ban đầu, nó sẽ là về 'phức tạp' như ví dụ 'array_map()' hoặc 'array_walk()' bên dưới, đặc biệt nếu bạn muốn thêm ví dụ thực hiện. –

+0

Vâng, tôi nghĩ rằng tôi là một trong những tính năng tuyệt vời nhất của PHP và là ví dụ hoàn chỉnh đầu tiên. :) – fuentesjr

+1

Xin chào, cảm ơn. Tất cả những gì tôi thực sự hỏi trong câu hỏi của tôi là nếu có một chức năng tích hợp - tôi không muốn phát minh lại bánh xe. Bạn đã cho tôi một câu trả lời cho điều đó, và giải pháp của bạn về cơ bản là những gì tôi đã viết. – Skilldrick

-1

Bạn có nghĩa là array_values?

Chỉnh sửa: Cảm ơn bạn đã giảm chú thích. Nếu bất cứ ai đã dành thời gian để thực sự xem tài liệu hướng dẫn cho hàm, bạn sẽ thấy nhận xét đầu tiên đưa ra một ví dụ về cách viết hàm array_values_recursive của riêng bạn. Kết hợp điều đó với array_walk và bạn sẽ có một hàm khá tiện lợi, không có cột 'tên' được mã hóa cứng vào nó. Sheesh.

+0

Tôi đã bình chọn bạn một lần nữa, nhưng thực sự có điều này bây giờ trở thành một cuộc thi để đưa ra giải pháp phức tạp nhất? :) –

+0

Cảm ơn. :) Hy vọng rằng đây không phải là một sự cạnh tranh, chỉ cần một chút khó chịu rằng điều này xảy ra rất nhiều khi tôi cố gắng chỉ đạo mọi người theo một hướng thay vì viết ra các giải pháp cho họ .. –

12

Đây là một cách chức năng để làm việc đó:

$data = array(
      array('page' => 'page1', 'name' => 'pagename1'), 
      array('page' => 'page2', 'name' => 'pagename2'), 
      array('page' => 'page3', 'name' => 'pagename3')); 

$result = array_map(create_function('$arr', 'return $arr["name"];'), $data); 
print_r($result); 
+1

Tôi thích điều này, và lambda trong nó phù hợp độc đáo với bộ não của tôi vào lúc này, như tôi đã học được Đề án. +1 – Skilldrick

1

Tương tự như giải pháp fuentesjrs, nhưng một chút chung chung hơn sử dụng array_walk() với một callback tùy chỉnh:

// Define the callback 
function extract_named_sub_elements(&$item, $key, $name) { 
    $item = $item[$name]; 
} 

// Test data 
$original = array(
    array('page' => 'page1', 'name' => 'pagename1'), 
    array('page' => 'page2', 'name' => 'pagename2'), 
    array('page' => 'page3', 'name' => 'pagename3'), 
); 

// Use a copy, as array_walk() operates directly on the passed in array 
$copy = $original; 

// Substitute 'name' with whatever element you want to extract, e.g. 'page' 
array_walk($copy, 'extract_named_sub_elements', 'name'); 

print_r($copy); 
0

Bạn có thể mở rộng ArrayIterator class và ghi đè phương thức mixed current(void).

class Foo extends ArrayIterator { 
    protected $index; 
    public function __construct($array, $index) { 
    parent::__construct($array); 
    $this->index = $index; 
    } 

    public function current() { 
    $c = parent::current(); 
    return isset($c[$this->index]) ? $c[$this->index] : null; 
    } 
} 

$a = array(
    array('page' => 'page1', 'name' => 'pagename1'), 
    array('name' => '---'), 
    array('page' => 'page2', 'name' => 'pagename2'), 
    array('page' => 'page3', 'name' => 'pagename3') 
); 

$f = new Foo($a, 'page'); 
foreach($f as $e) { 
    echo $e, "\n"; 
} 

in

page1 

page2 
page3 
0

Tôi không nghĩ có bất kỳ cần phải có một xây dựng trong chức năng cho việc này. Có thể có một mảng trong mảng của bạn.

$samples=array(
      array('page' => 'page1', 'name' => 'pagename1'), 
      array('page' => 'page2', 'name' => 'pagename2'), 
      array('page' => 'page3', 'name' => 'pagename3') 
      ); 

$output1=array(); 
$output2=array(); 
foreach($samples as $sample){ 
    array_push($output1,$sample['name']); 
    $output2[]=array_splice($sample,1); 

} 

print_r($output1); 
print_r($output2); 

trong $ output1 là đầu ra những gì bạn muốn nếu bạn chỉ muốn loại bỏ phần 'trang' lập chỉ mục '$ output2.

nếu bạn cần tất cả các giá trị từ mảng đó và chỉ số về số mảng sau đó bạn có thể sử dụng

$array_1=array_values($samples); 

nhưng những gì tôi hiểu, bạn không muốn điều này.

49

Tính đến PHP 5.5 bạn có thể sử dụng array_column():

<?php 
$samples=array(
      array('page' => 'page1', 'name' => 'pagename1'), 
      array('page' => 'page2', 'name' => 'pagename2'), 
      array('page' => 'page3', 'name' => 'pagename3') 
      ); 
$names = array_column($samples, 'name'); 
print_r($names); 

See it in action

+0

Rất tốt, cảm ơn John. Tôi đã nghiên cứu về PHP 5.5, nhưng tôi đã không nhìn thấy điều này –

+10

Điều này nên là câu trả lời chính xác ngay bây giờ kể từ khi php đã thêm vào được xây dựng trong chức năng mà chính xác những gì OP được yêu cầu. – MJoraid

1
if (!function_exists('array_column')) { 
    function array_column($array,$column) { 
    $col = array(); 
    foreach ($array as $k => $v) { 
     $col[]=$v[$column]; 
    } 
    return $col; 
    } 
} 

này nên làm việc cho các phiên bản php < 5.5 và phân huỷ trong trường hợp hàm tồn tại

4

Vâng có. Ít nhất cho PHP> 5,5.0 và nó được gọi array_column

Chức năng PHP có một tùy chọn tham số $index_key rằng - theo trang web PHP - khẳng định:

$index_key

Cột để sử dụng như các chỉ số/phím cho mảng được trả về. Giá trị này có thể là khóa nguyên của cột hoặc có thể là tên khóa chuỗi

Trong câu trả lời ở đây, tôi thấy phiên bản bị tước mà không có tham số tùy chọn. tôi cần nó, vì vậy, đây là chức năng hoàn chỉnh:

if (!function_exists('array_column')) { 
    function array_column($array, $column, $index_key = null) { 
     $toret = array(); 
     foreach ($array as $key => $value) { 
      if ($index_key === null){ 
       $toret[] = $value[$column]; 
      }else{ 
       $toret[$value[$index_key]] = $value[$column]; 
      } 
     } 
     return $toret; 
    } 
} 
1

Vâng, có một php tích hợp chức năng gọi array_column mà làm những gì bạn đang tìm kiếm.

Bạn sẽ gọi nó là một cái gì đó như $name_keys = array_column($array, 'name'); để có được kết quả mà bạn đang tìm kiếm.

Vui lòng tham khảo các mục sau đây trong cuốn hướng dẫn PHP để biết thêm chi tiết:

http://php.net/manual/en/function.array-column.php

+0

Cảm ơn bạn đã làm cho câu trả lời đầy đủ. – Dinesh

+1

Câu trả lời này chỉ hợp lệ nếu phiên bản PHP lớn hơn 5. – Dinesh

+0

Lớn hơn 5.5, chính xác. – cytsunny

0

Đây là một cuộc gọi khá dễ dàng để array_reduce.

$valuesOnly = array_reduce($modelData, function ($carry, $item) { 
    return array_merge($carry, $item['id']); 
}, []); 
-1

Chỉ để mở rộng một số câu trả lời ở đây, kể từ PHP 5,5, mảng_column là những gì bạn muốn.

Thực tế có một số cách sử dụng có thể.

Sử dụng mảng mẫu dưới đây, dưới đây là các cách khác nhau để sử dụng mảng_column.

$a = array(
    array('id' => '1', 'name' => 'Joe'), 
    array('id' => '2', 'name' => 'Jane') 
); 

Lấy một cột duy nhất là mảng

$b = array_column($a, 'name'); 

sẽ cung cấp cho bạn. Chú ý các phím tự động bắt đầu từ 0, theo một mảng bình thường.

$b[0] = 'Joe'; 
$b[1] = 'Jane'; 

Lấy mảng đầy đủ có cột làm chỉ mục.

$c = array_column($a, NULL, 'id'); 

Sẽ dẫn đến những điều sau đây.

$c[1] = array('id' => '1', 'name' => 'Joe'); 
$c[2] = array('id' => '2', 'name' => 'Jane'); 

Lưu ý cách cột tôi chọn làm thông số thứ ba trở thành chìa khóa cho mỗi mục và tôi nhận được mảng đầy đủ bằng cách đặt thông số thứ hai thành rỗng.

Tất nhiên, cách sử dụng cuối cùng là đặt cả tham số thứ 2 và thứ 3.

$d = array_column($a, 'name', 'id'); 

Sẽ cung cấp cho bạn những điều sau đây.

$d[1] = 'Joe'; 
$d[2] = 'Jane'; 

Cá nhân tôi sử dụng đầy đủ 3 thông số để tạo danh sách tùy chọn chọn.Nếu tôi có một bảng với các tùy chọn của tôi, tôi truy vấn bảng và nhận kết quả và chuyển nó vào đây để lấy danh sách có khóa làm giá trị và nhãn. Đây là một cách tuyệt vời để xây dựng bộ thông tin cần phải giao nhau theo chỉ mục.

0

tôi muốn gửi ở đây, thậm chí nếu điều này là một câu hỏi cũ, vì nó vẫn còn rất phù hợp và nhiều nhà phát triển không sử dụng PHP> = 5,5

Hãy nói rằng bạn có một mảng như thế này:

Array 
(
    [files] => Array 
     (
      [name] => Array 
       (
        [0] => file 1 
        [1] => file 2 
        [2] => file 3 
       ) 

      [size] => Array 
       (
        [0] => 1 
        [1] => 2 
        [2] => 3 
       ) 

      [error] => Array 
       (
        [0] => abc 
        [1] => def 
        [2] => ghi 
       ) 

     ) 

) 

và đầu ra bạn muốn là một cái gì đó như thế này:

Array 
(
    [0] => Array 
     (
      [0] => file 1 
      [1] => 1 
      [2] => abc 
     ) 

    [1] => Array 
     (
      [0] => file 2 
      [1] => 2 
      [2] => def 
     ) 

    [2] => Array 
     (
      [0] => file 3 
      [1] => 3 
      [2] => ghi 
     ) 

) 

bạn chỉ có thể sử dụng phương pháp array_map() mà không có một tên hàm truyền như tham số đầu tiên, như vậy:

array_map(null, $a['files']['name'], $a['files']['size'], $a['files']['error']); 

Rất tiếc, bạn không thể ánh xạ khóa nếu truyền nhiều hơn một mảng.

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