【问题标题】:PHP : Rename keys of associative array to the value of a child element when given the childs key namePHP:当给定子键名时,将关联数组的键重命名为子元素的值
【发布时间】:2015-03-31 09:55:37
【问题描述】:

是否有一个我错过的 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

【问题讨论】:

  • 您希望输出是什么数组格式?
  • 我稍微改变了问题,这有帮助吗?

标签: php arrays pass-by-reference


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您必须告诉函数是否“通过引用传递”它无法知道您是否尝试将返回的结果设置为变量;

    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;
    

    【讨论】:

      猜你喜欢
      • 2016-02-25
      • 1970-01-01
      • 2020-04-14
      • 2012-09-16
      • 2014-01-28
      • 2021-12-31
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      相关资源
      最近更新 更多