【问题标题】:How to change keys of a array in PHP?如何在 PHP 中更改数组的键?
【发布时间】:2019-05-16 09:31:43
【问题描述】:

我有以下数组:

array(10) {
  [0]=>
  array(2) {
    ["id"]=>
    string(2) "73"
    ["position"]=>
    string(1) "1"
  }
  [1]=>
  array(2) {
    ["id"]=>
    string(2) "58"
    ["position"]=>
    string(1) "2"
  }
  [2]=>
  array(2) {
    ["id"]=>
    string(2) "82"
    ["position"]=>
    string(1) "3"
  }
  [3]=>
  array(2) {
    ["id"]=>
    string(2) "84"
    ["position"]=>
    string(1) "4"
  }
  [4]=>
  array(2) {
    ["id"]=>
    string(2) "74"
    ["position"]=>
    string(1) "5"
  }
  [5]=>
  array(2) {
    ["id"]=>
    string(2) "59"
    ["position"]=>
    string(1) "6"
  }
  [6]=>
  array(2) {
    ["id"]=>
    string(2) "72"
    ["position"]=>
    string(1) "7"
  }
  [7]=>
  array(2) {
    ["id"]=>
    string(2) "78"
    ["position"]=>
    string(1) "7"
  }
  [8]=>
  array(2) {
    ["id"]=>
    string(2) "77"
    ["position"]=>
    string(1) "8"
  }
  [9]=>
  array(2) {
    ["id"]=>
    string(2) "71"
    ["position"]=>
    string(1) "8"
  }
}

我希望将数组的 keys indexes 替换为位置值。输出应如下所示:

array(10) {
  [1]=>
  array(2) {
    ["id"]=>
    string(2) "73"
    ["position"]=>
    string(1) "1"
  }
  [2]=>
  array(2) {
    ["id"]=>
    string(2) "58"
    ["position"]=>
    string(1) "2"
  }
  [3]=>
  array(2) {
    ["id"]=>
    string(2) "82"
    ["position"]=>
    string(1) "3"
  }
  [4]=>
  array(2) {
    ["id"]=>
    string(2) "84"
    ["position"]=>
    string(1) "4"
  }
  [5]=>
  array(2) {
    ["id"]=>
    string(2) "74"
    ["position"]=>
    string(1) "5"
  }
  [6]=>
  array(2) {
    ["id"]=>
    string(2) "59"
    ["position"]=>
    string(1) "6"
  }
  [7]=>
  array(2) {
    ["id"]=>
    string(2) "72"
    ["position"]=>
    string(1) "7"
  }
  [7]=>
  array(2) {
    ["id"]=>
    string(2) "78"
    ["position"]=>
    string(1) "7"
  }
  [8]=>
  array(2) {
    ["id"]=>
    string(2) "77"
    ["position"]=>
    string(1) "8"
  }
  [8]=>
  array(2) {
    ["id"]=>
    string(2) "71"
    ["position"]=>
    string(1) "8"
  }
}

我尝试了下面的代码,但它只打印数组中的一个元素:

$newarr = array();

$values = $this->request->get( 'values', null );

foreach ($values as $oldkey => $value) {
    $position = $value["position"];
    $newarr[$position] = $values[$oldkey];
    $values=$newarr;
    unset($newarr);
}
var_dump($values);exit;

$values 的 var_dump 结果是

<br />
<b>Notice</b>:  Undefined offset: 8 in ResourcesController.php</b> 
<b>Notice</b>:  Undefined offset: 9 in ResourcesController.php</b> on line <b>367</b><br />
array(1) {
  [8]=>
  NULL
}`

【问题讨论】:

  • 你不能那样做。您不能拥有具有多个具有相同键的值的数组。
  • 您不能拥有具有相同值的索引。您有多个具有相同值的位置 - 它们不是唯一的,因此不能用作数组中的索引。
  • 尼克抓得好!第一眼没看到
  • @Nick 是的,这是一个错字。
  • 那么如果两个位置相同会怎样呢?

标签: php arrays sorting


【解决方案1】:

array_column 足以帮助您。

$result = array_column($yourarray, null, 'position');

column_key 要返回的值的列。这个值可能是一个整数键 您希望检索的列,或者它可能是一个字符串键名 关联数组或属性名称。返回也可能为NULL 完整的数组或对象(这与 index_key 一起很有用 重新索引数组)。

语法

array_column ( array $input , mixed $column_key [, mixed $index_key = NULL ] ) : array

工作demo

【讨论】:

  • 您的工作演示不工作,因为它删除了两个项目
  • @Andreas 这是一个错字
  • 没关系。您的方法将截断任何重复的位置键
  • 嗯...好斗?你希望我为你把每一个字都用棉花包起来吗?我是说你的方法会截断数据。这是事实,并不具有攻击性。
  • 数据有误,所以会截断。但是啊,是的,我错了,你是对的。参加主持人选举我将是第一个投票给你的人;)你正在为 SO 做最好的事情来改善周围的事情
【解决方案2】:

您可以将array_combine()range()count() 一起使用

$array = array_combine(range(1, count($arr)), $arr);

输出:- https://3v4l.org/k0XTj

参考:

array_combine()

range()

count()

【讨论】:

  • 是的,这是一个错字!
猜你喜欢
  • 2010-09-19
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 2019-05-20
  • 2021-04-14
  • 1970-01-01
  • 2013-12-31
  • 2015-10-01
相关资源
最近更新 更多