簡體   English   中英

PHP:在給定子鍵名稱的情況下,將關聯數組的鍵重命名為子元素的值

[英]PHP : Rename keys of associative array to the value of a child element when given the childs key name

是否有我想念的PHP函數會在給定其子項(關聯數組)的鍵名時更改父數組的鍵,或者至少有我目前正在使用的foreach循環的替代方法按鍵。

示例數組

    $arr = array( 
        array(
            'id' => 1,
            'name' => 'one',
        ),
        array(
            'id' => 2,
            'name' => 'two',
        ),
        array(
            'id' => 3,
            'name' => 'three',
        ) 
    ); 

我希望它像這樣工作。

$arr_name = array_change_key($arr,'name');
print_r($arr_name);
$arr_name => array( 
        'one', => array(
            'id' => 1,
            'name' => 'one',
        ),
        'two' => array(
            'id' => 2,
            'name' => 'two',
        ),
        'three' => array(
            'id' => 3,
            'name' => 'three',
        ) 
    );
//$arr is unchanged

這只是一個額外的補充(不確定是否可能)

array_change_key($arr,'name');
print_r($arr);

//$arr has changed because it doesn't have a variable to set 
$arr => array( 
        'one', => array(
            'id' => 1,
            'name' => 'one',
        ),
        'two' => array(
            'id' => 2,
            'name' => 'two',
        ),
        'three' => array(
            'id' => 3,
            'name' => 'three',
        ) 
    );

print_r($arr[0]); //undefined index

如果我正確理解了該問題,則類似於:

$arr = array_combine(
    array_column($arr, 'name'),
    $arr
);

將使用每個記錄的name值作為父鍵,並給出

array(3) {
  ["one"]=>
  array(2) {
    ["id"]=>
    int(1)
    ["name"]=>
    string(3) "one"
  }
  ["two"]=>
  array(2) {
    ["id"]=>
    int(2)
    ["name"]=>
    string(3) "two"
  }
  ["three"]=>
  array(2) {
    ["id"]=>
    int(3)
    ["name"]=>
    string(5) "three"
  }
}

您將不得不告訴該函數是否“通過引用傳遞”,它無法知道您是否正在嘗試將返回的結果設置為變量。

function array_change_key(array &$array, $key, $pass_by_reference = false){

    if($pass_by_reference){

       // check is_scalar($key)
       if(!is_scalar($key)) return FALSE; 
       // we already know isset($array), is_array($array) and isset(key) are true because $pass_by_reference is true;

        $array = markBakersAnswer($array,$key);

        return TRUE;
        //  pass-by-reference functions usually return true or false
    }
    return markBakersAnswer($array,$key);
}

MarkBakersAnswer +1

$new_array = array_change_key($arr, 'name');        // $arr unchanged and $new_array == array with new keys
$new_array = array_change_key($arr, 'name', false); // $arr unchanged and $new_array == array with new keys

$new_array = array_change_key($arr, 'name', true);  // $arr changed (new keys),  $new_array = TRUE;
$new_array = array_change_key($arr, array(), true); // $arr changed (new keys),  $new_array = FALSE;

暫無
暫無

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

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