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;