【问题标题】:How to unset dynamically generated multidimensional array如何取消设置动态生成的多维数组
【发布时间】:2014-07-14 17:20:45
【问题描述】:

我正在尝试删除一个数组,其中一个值..(时间)满足特定条件。 \我目前正在使用的代码如下所示:

foreach($_SESSION as $key) {
   foreach($key['time'] as $keys=>$value){
      if(condition){
      unset($key);
   }
}
}

数组看起来像这样。

Array
    (
[form1] => Array
    (
        [hash] => lFfKBKiCTG6vOQDa8c7n
        [time] => 1401067044
    )

[form5] => Array
    (
        [hash] => TTmLVODDEkI1NrRnAbfB
        [time] => 1401063352
    )

[form4] => Array
    (
        [hash] => XCVOvrGbhuqAZehBmwoD
        [time] => 1401063352
    )

我尝试从这些页面调整解决方案,但没有奏效。

Remove element in multidimensional array and save

PHP - unset in a multidimensional array

PHP How to Unset Member of Multidimensional Array?

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案1】:

    如果您想取消设置其中的值,一个简单的 foreach 就足够了。考虑这个例子:

    $values = array(
        'form1' => array('hash' => 'lFfKBKiCTG6vOQDa8c7n', 'time' => 1401067044),
        'form5' => array('hash' => 'TTmLVODDEkI1NrRnAbfB', 'time' => 1401063352),
        'form4' => array('hash' => 'XCVOvrGbhuqAZehBmwoD', 'time' => 1401063352),
    );
    $needle = 1401067044;
    foreach($values as $key => &$value) {
        if($value['time'] == $needle) {
            // if you want to remove this key pair use this
            unset($values[$key]['time']);
            // if you just want to remove the value inside it
            $value['time'] = null;
            // if you want to remove all of this entirely
            unset($values[$key]);
        }
    }
    

    Fiddle

    【讨论】:

    • 我在网上收到Notice: Undefined index: time in C:\wamp\www\email.php on line 54 if($value['time'] == $needle) {
    • @dotman14 可能与您的数组值不匹配,因为它在这里可以正常工作(codepad.viper-7.com/eY7M2f)(还在 anwser 上添加了小提琴)
    【解决方案2】:

    在 for 循环中取消设置可能会导致问题,使用针对此类问题优化的array_filter 更容易更好。以下是如何使用您的示例进行操作。 ideone running code

    <?php
    
    
    $ar = Array(
      "form1" => Array
      (
        "hash" => 'lFfKBKiCTG6vOQDa8c7n',
        "time" => '1401067044'
       ),
      "form5" => Array
      (
        "hash" => 'TTmLVODDEkI1NrRnAbfB',
        "time" => '1401063352'
       ),
      "form4" => Array
      (
        "hash" => 'XCVOvrGbhuqAZehBmwoD',
        "time" => '1401063352'
       )
    );
    
    $condition = '1401067044';
    $newArray = array_filter($ar, function($form) use ($condition) {
        if (!isset($form['time'])) {
          return true;
        }
        return $form['time'] != $condition;
    });
    
    var_export($newArray);
    

    array_filter

    【讨论】:

      【解决方案3】:

      假设您的值存储在$_SESSION

      foreach($_SESSION as $key => $value) {
          if(isset($value['time']) && $value['time'] < 1401063352) {
              unset($_SESSION[$key]);
          }
      }
      

      如果您将值存储在 $_SESSION 中,您可能需要考虑将它们存储在像 $_SESSION['myForms'] 这样的子字段中,因此如果您需要将其他值添加到会话中,您可以轻松地仅访问您需要的值.

      【讨论】:

      • 已经有字段$_SESSION['form1']、$_SESSION['form2']等
      • @dotman14 假设您想在会话中存储一些其他信息,即 $_SESSION['user_id'],那么如果您的所有表单都存储在 $_SESSION['myForms'] 下会很有用即 $_SESSION['myForms']['form1'], $_SESSION['myForms']['form2'] 等,因此您可以仅迭代表单而不是所有会话值
      • 好的,我明白了。删除所有数组的解决方法。
      【解决方案4】:

      你需要做的

      unset($_SESSION[$key])
      

      不过,正如 Victory 所说,array_filter 可能是解决此问题的更好方法。

      【讨论】:

      • PHP 并不总是复制将要迭代的数组。
      • 请阅读以下内容:nikic.github.io/2011/11/11/… - nikic 是 PHP 核心开发人员。 “仍然有些人不喜欢使用它,因为他们认为它很慢。通常命名的一个原因是 foreach 复制了它迭代的数组。”
      • 有时它会进行一些复制,但并非总是如此。参考文献nikic.github.io/2011/11/11/…
      • 删除了对正在复制的数组的所有引用。感谢您的提醒。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      • 2011-11-07
      • 2015-09-30
      • 1970-01-01
      • 2011-02-17
      相关资源
      最近更新 更多