2009-09-29 51 views
14

我有數組的數組,結構如下:有沒有從PHP中的數組中提取'列'的函數?

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

有一個內置函數,它會返回一個新的數組與「名稱」鍵只值是多少?所以我會得到:

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

24小時?過早。等待48小時。這對於讓一些答案獲得更多選票並將其打開以獲得更多相關答案是很好的。 – random 2009-09-30 09:27:57

+0

我的意思不是聽起來像一個混蛋,但這不是一個複雜的問題,幾天之後就會發現一個驚人的解決方案。 – fuentesjr 2009-09-30 18:55:40

回答

17

爲什麼它必須是內置函數?不,沒有,寫你自己的。

這是一個不錯的和容易的,而不是在這個線程中的其他人。

$namearray = array(); 

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

好吧,考慮到你最近的編輯('簡單的,作爲)我會咬;) 如果你根據原始請求將你的代碼變成一個真正的函數,它將和'array_map()'或'array_walk()'示例一樣'複雜'下面,特別是如果你想添加一個執行的例子。 – 2009-09-29 23:12:09

+0

是的,我認爲我的PHP是最優雅的功能和第一個完整的例子。 :) – fuentesjr 2009-09-30 06:19:19

+1

嗨,謝謝。我在問題中實際問到的是如果有內置功能 - 我不喜歡重新發明輪子。你給了我一個答案,你的解決方案基本上是我寫的。 – Skilldrick 2009-09-30 21:49:57

-1

你的意思是array_values

編輯:謝謝你的評論downvote。如果誰花時間真正查看函數的文檔,您會看到第一個註釋,它提供了編寫自己的array_values_recursive函數的示例。把它和array_walk結合起來,你會得到一個非常漂亮的函數,它不會將'name'列寫入硬編碼。嘖。

+0

我再次投票贊成你,但是現在真的有這種競爭來想出最複雜的解決方案嗎? :) – 2009-09-29 21:28:55

+0

謝謝。 :)希望這不是一個競爭,只是有點惱火,這種情況發生了很多,當我嘗試在一個方向上轉向人,而不是爲他們寫出解決方案。 – 2009-09-29 21:37:18

12

下面是做這件事的一個功能性的方式:

$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

我喜歡這一點,並在它的拉姆達與我的大腦在此刻非常適合,因爲我一直在學習計劃。 +1 – Skilldrick 2009-09-30 21:48:49

1

類似fuentesjrs的解決方案,但有點更通用的使用array_walk()的一個定製的回調:

// 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

你可以擴展ArrayIterator class並覆蓋方法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"; 
} 

打印

page1 

page2 
page3 
0

我不認爲有任何需要有一個內置的功能這一點。 這些數組中可能有一個數組。

$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); 

in $ output1是你想要的輸出,如果你只想刪除'page'indexing'part然後輸出$ output2。

如果你需要從該數組中的所有值和索引數值數組,那麼你可以使用

$array_1=array_values($samples); 

但我明白,你不想要這個。

49

由於PHP 5.5您可以使用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

很好,謝謝約翰。我一直在研究PHP 5.5,但我沒有看到這個 – 2013-04-02 10:49:59

+10

這應該是現在正確的答案,因爲PHP已經添加了內置函數,正是OP所要求的。 – MJoraid 2013-12-31 08:20:12

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

這應該PHP版本< 5.5工作,並降低的情況下,該功能存在

4

那麼有。至少對於PHP> 5.5。0,它被稱爲array_column

PHP函數有一個可選的$index_key參數 - 按照PHP網站 - 規定:

$index_key

作爲索引/鍵使用的列返回數組。此值 可能是列的整數關鍵,也可能是字符串鍵名

在這裏的答案,我看到一個精簡版本,沒有可選參數。 我需要它,所以,這裏是完整的功能:

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

是的,有一個PHP的內置函數調用array_column這確實你在找什麼。

你可以把它叫做$name_keys = array_column($array, 'name');來得到你要找的結果。

請參考PHP手冊以下條目瞭解更多詳情:

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

+0

感謝kguest讓它成爲完整的答案。 – Dinesh 2015-05-08 00:15:34

+1

此答案僅在PHP版本大於5時有效。 – Dinesh 2015-05-08 00:17:50

+0

確切地說,大於5.5。 – cytsunny 2015-06-15 05:41:51

0

這是一個非常簡單的調用array_reduce。

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

爲了擴展這裏的一些答案,從PHP 5.5開始,array_column就是你想要的。

它實際上有一些可能的用途。

使用下面的示例數組,下面是使用array_column的不同方法。

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

檢索單個列作爲數組

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

會給你。按照常規數組注意從0開始的自動鍵。

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

以列作爲索引檢索完整數組。

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

會導致以下情況。

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

通知我選擇作爲第三個參數列如何成爲每個項目的鍵,並通過我設置爲空的第二個參數得到完整的陣列。

當然,最後的用法是設置第二和第三參數。

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

會給你以下。

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

我個人使用完整的3個參數來創建選擇選項列表。如果我有一個包含我的選項的表格,我查詢表格並獲取結果並將其傳遞給此列表,以獲取包含鍵值和標籤的列表。這是構建需要與索引相交的信息集合的絕佳方式。

0

我想在這裏發帖,即使這是一個老問題,因爲它仍然是非常相關的,許多開發人員沒有使用PHP> = 5.5

比方說,你有一個數組是這樣的:

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 
       ) 

     ) 

) 

和你想要的輸出是這樣的:

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 
     ) 

) 

您可以簡單地使用array_map()方法,而不作爲第一個參數,像這樣通過一個函數名稱:

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

不幸的是,如果傳遞多個數組,則不能映射密鑰。

相關問題