簡體   English   中英

php:最簡單的方法將索引的二維數組轉換為關聯索引的包含值的二維數組?

[英]php: simplest way to turn an indexed two-dimensional array into an associatively indexed-by-a-contained-value two-dimensional array?

我不斷發現自己在數據庫上運行查詢並獲得表示行的多維數組。 不幸的是,第一級索引是數字的,這不是很有用。 我經常在表中使用帶有標識字符串的表,並希望將生成的多維數組轉換為由該標識列關聯索引的內容。

一個不起眼的自創自定義功能,可以做我想要的:

function identity_associate($data, $identity_column='identity'){
    $res = array();
    foreach($data as $single_row){
        $loop_identity = $single_row[$identity_column];
        $res[$loop_identity] = $single_row;
    }
    return $res;
}

顯然我每次想要這樣做時都可以使用foreach循環,或者每當我將數據傳遞給它時使用該函數為我做這個函數,但是如果有一個內置的方法可以用普通的php函數做到這一點,我寧願使用它來進行修正。 我試圖在php文檔中找到適合排序和數組的東西,但找不到任何確切的東西,谷歌也沒什么幫助。 任何人都知道php本地或其他更簡單的東西?

即我想轉換查詢數據庫時獲得的數據...

array(
  array(
    'user_id'=>45,
    'identity'=>'bob',
    'name'=>'Bob'
  ),
  array(
    'user_id'=>51, 
    'identity'=>'tchalvak', 
    'name'=>'TchalVak'
  )
);

更有用的東西

array(
  'bob'=>array(
    'user_id'=>45, 
    'identity'=>'bob', 
    'name'=>'Bob'
  ), 
  'tchalvak'=>array(
    'user_id'=>51, 
    'identity'=>'tchalvak', 
    'name'=>'TchalVak'
  )
);

盡可能優化,因為它是我一直在任何地方使用的東西。

編輯:

我想指出,我通過調用PDO中的內置函數從數據庫中獲取該格式的數據,並返回相當於第一個數組:

$statement->execute();
return $statement->fetchAll(PDO::FETCH_ASSOC);

例如,調用下面的sql:

$data = query('select name, user_id, identity from users order by identity');

...會在問題的頂部得到第一個數組。

我正在考慮通過應用array_unshift()函數的數組映射來關閉第一個元素,然后將array_map()返回的數組與array_combine()的原始數組array_combine() 這是一個示例,請記住,只有當identity元素是子數組的第一個元素時,它才會起作用:

<?php
$arrs = array(
            array(
                'identity'=>'bob',
                'user_id'=>45,
                'name'=>'Bob'
            ),
            array(
                'identity'=>'tchalvak',
                'user_id'=>51, 
                'name'=>'TchalVak'
            )
        );

$identites = array_map( 'array_shift', $arrs );
$formatted = array_combine( $identites, $arrs );
print_r( $formatted );
?>

如果標識不是第一個元素,如果需要,您可以創建一個輔助函數來傳遞給數組映射。

<?php
$arrs = array(
            array(
                'identity'=>'bob',
                'user_id'=>45,
                'name'=>'Bob'
            ),
            array(
                'identity'=>'tchalvak',
                'user_id'=>51, 
                'name'=>'TchalVak'
            )
        );

$identites = array_map( 'array_grab', $arrs );
$formatted = array_combine( $identites, $arrs );
print_r( $formatted );

function array_grab( $array ) { return( $array['identity'] ); }
?>

我相信你的數組也是定制的,也有內置於PHP的內容。 您可以使用array_map並保存在foreach上,但這並沒有真正節省太多(並且消除了$identify_column參數)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM