【问题标题】:Popping the key & value from an associative array in PHP从 PHP 中的关联数组中弹出键和值
【发布时间】:2011-09-30 08:06:11
【问题描述】:

让 S 成为 PHP 中的关联数组,我需要从中检索并提取第一个元素,包括值和键。

我会用

value1=array_pop(S);

但它只给了我价值。

我可以使用

K=array_keys(S);
key1=array_pop(K);
value1=array_pop(S);

但这很复杂,因为它需要拥有相同数据的两个副本。这令人困惑,因为数组本身就是数组数组中的一个元素。必须有一种更优雅的方式来在提取一对键/值时读取它。

【问题讨论】:

  • 您要移动(第一个元素)还是弹出(最后一个元素)?

标签: php associative-array


【解决方案1】:
$value = reset($arr);
$key = key($arr);

(按顺序)

reset()PHP Manual, key()PHP Manual.

unset($arr[$key]); # in case you want to remove it.

但是array_pop()PHP Manual 正在使用最后一个元素:

$value = end($arr);
$key = key($arr);
unset($arr[$key]); # in case you want to remove it.

end()PHP Manual

为了好玩:

list($value, $key) = array(end($arr), key($arr));

extract(array('value'=>end($arr), 'key'=>key($arr)));

end($arr);
list($key, $value) = each($arr);

或任何你喜欢的游戏风格;)

处理空数组

目前还缺少处理空数组的方法。所以需要检查是否有最后一个(第一个)元素,如果没有,将$key 设置为null(因为null 不能是数组键):

for($key=null;$key===null&&false!==$value=end($arr);)
    unset($arr[$key=key($arr)]);

这将提供像$arr = array('first' => '1st', 'last' => '2nd.');这样的填充数组:

string(4) "2nd." # value
string(4) "last" # key
array(1) { # leftover array
  ["first"]=>
  string(3) "1st"
}

还有一个空数组:

bool(false) # value
NULL # key
array(0) { # leftover array
}

害怕使用 unset?

如果您不相信 unset() 具有您需要的性能(我认为这不是一个真正的问题,尽管我没有运行任何指标),您可以使用本机 array_pop() 实现也一样(但我真的认为unset() 作为一种语言结构可能会更快):

end($arr);
$key = key($arr);
$value = array_pop($arr);

【讨论】:

  • 谢谢。我不相信: unset($arr[$key]);看起来它需要系统再次遍历数组才能找到实际值。
  • PHP 中的数组是散列。这是一个查找操作,而不是搜索整个数组,而且速度很快。
  • 是的,我也喜欢。如果您还需要处理空数组,那么紧凑的形式会变得有点棘手,所以为了好玩,您可以找到另一个编辑。
  • 不幸的是,我正在对其进行测试,但它无法正常工作。问题是我真的需要删除元素,而不仅仅是推进计数器。所以我怕我会用unset。谢谢您的帮助。 :-)
  • @Pietro:害怕使用 unset?我添加了另一段代码,您可以随时选择array_shiftarray_pop
【解决方案2】:
list($value, $key) = array(reset($s), key($s));
array_shift($s); // or just unset($s[$key]);

当然你可以把第一条语句分成两个独立的。

【讨论】:

  • 怎么样:$key=key($s); $value=array_shift($s);这行得通吗?
  • 是的。这就是我所说的“你可以拆分 [it]”:)(只要数组指针指向第一个元素(reset() 就是这样做的),
  • 不幸的是,每次我使用 array_shift 时,数组都是空的。如果我之前使用重置,则独立。如上所述,我想我会使用 unset。
【解决方案3】:
$value = reset($array);
$key = key($array);

编辑:Hakre 打败了我 :-)

【讨论】:

    【解决方案4】:

    array_slice

    $arr = array('k1' => 'v1', 'k2' => 'v2', 'k3' => 'v3');
    
    $a = array_slice($arr, 0, 1);
    var_dump($a);
    
    $arr = array_slice($arr, 1);
    var_dump($arr);
    
    
    array(1) {
      ["k1"]=>
      string(2) "v1"
    }
    array(2) {
      ["k2"]=>
      string(2) "v2"
      ["k3"]=>
      string(2) "v3"
    }
    

    【讨论】:

    • array_slice() 是个好主意。取决于应该如何处理键和值:list($key, $value) = array_slice($arr, 0, 1);
    • array_slice() 相当慢,不是吗?我的意思是这是一个很好的功能,但就从数组末尾弹出而言......
    • array_slice 与 $preserve_keys 设置为 true,将保留以前的键
    猜你喜欢
    • 2021-11-09
    • 1970-01-01
    • 2013-02-09
    • 2015-07-23
    • 2021-03-16
    • 1970-01-01
    • 2019-05-11
    • 2015-08-05
    • 2013-05-02
    相关资源
    最近更新 更多