2015-03-31 47 views
-1

是否有PHP函数我错过了将在给定子项的键名时更改父数组的键关联数组),还是至少有一个替代foreach循环,我正在使用此刻来更改密钥。PHP:当给定childs键名称时,将关联数组的键重命名为子元素的值

例阵列

$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 
+0

你的愿望阵列格式将在输出中呢? – catzilla 2015-03-31 09:58:50

+0

我已经稍微改变了这个问题,这有帮助吗? – TarranJones 2015-03-31 10:09:11

回答

2

如果我正确理解这个问题,例如:

$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" 
    } 
} 
+0

谢谢马克,对我来说很好, – TarranJones 2015-03-31 10:14:18

0

你将不得不告诉函数是否要“按引用传递”,它没有办法知道是否方式你正试图将返回的结果设置为一个变量;

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;