【问题标题】:Delete/unset from a global array using a function / method使用函数/方法从全局数组中删除/取消设置
【发布时间】:2014-05-12 10:54:37
【问题描述】:

我有一个保存所有配置的 GLOBAL 数组,它看起来像这样:

$_SOME_ARRAY = array(
                'some_setting' => array(
                                    'some_value' => '1',
                                    'other' => 'value'
                                ),  
                'something_else' => 1,
            );

我怎样才能从这个数组中删除键,使用如下函数:

deleteFromArray('some_setting/other')

我尝试了不同的方法,但似乎找不到方法,无需手动调用unset($_SOME_ARRAY['some_setting']['other'])即可将其删除

编辑

我已经尝试过使用它。到目前为止,我看到的唯一解决方案是通过循环遍历每个值并验证来“重建”原始数组。进展:

        public static function delete($path) {
            global $_EDU_SETUP;

            $exploded_path = explode('/', $path);

            $newConfig = array();

            $delete = false;

            foreach($exploded_path as $bit) {

                if(!$delete) {
                    $loop = $_EDU_SETUP;
                } else {
                    $loop = $delete;
                }

                foreach($loop as $key => $value) {

                    if($key == $bit) {
                        echo 'found first: ' . $key . '<br />'; // debugging

                        if(!$delete) {
                            $delete = $_EDU_SETUP[$key];
                        } else {
                            $delete = $delete[$key];
                        }
                    } else {
                        $newConfig[$key] = $value;
                    }
                }
            }

            $_EDU_SETUP = $newConfig;
        }

数组可能如下所示:

$array = array(
    'a' => array(
        'a',
        'b',
        'c'
    ),
    'b' => array(
        'a',
        'b',
        'c' => array(
            'a',
            'b',
            'c' => array(
                'a'
            ),
        ),
    )
);

要删除 $array['b']['c'] 你可以写 Config::delete('b/c'); - 但是:它会删除整个 B。它应该只删除 C。

有什么想法吗?

【问题讨论】:

  • 为什么不直接用explode 分割刺痛并在deleteFromArray 函数中使用参数?顺便说一句,你可以使用$_SESSION :)
  • 这个数组是不是只有2个维度?
  • 否 - 无限量
  • 您可以发布一个包含您想要达到的结果的数组吗? :)

标签: php arrays


【解决方案1】:

这是你可以做的,假设数组有 2 个级别的数据。

 $_SOME_ARRAY = array(
                    'some_setting' => array(
                                        'some_value' => '1',
                                        'other' => 'value'
                                    ),  
                    'something_else' => 1,
                );

function deleteFromArray($param){
    global $_SOME_ARRAY ;
    $param_values = explode("/",$param);
    if(count($param_values) == 2 ){
        unset($_SOME_ARRAY[$param_values[0]][$param_values[1]]);
    }else{
        unset($_SOME_ARRAY[$param_values[0]]);
    }
}

deleteFromArray('some_setting/other');
print_r($_SOME_ARRAY);

您可以通过在使用函数array_key_exists()进行取消设置之前检查密钥是否存在来修改函数以添加更严格的规则

【讨论】:

  • 好吧 - 我不想假设任何事情,因为配置数组应该能够根据需要尽可能大。
  • 我的意思是二维数组,即array['one']['two']
  • 我已经用其他信息编辑了我的帖子。也许这会有所帮助。
【解决方案2】:

你觉得这个怎么样?

$_SESSION = $_SOME_ARRAY; // Btw it should be session from beginning...

function deleteFromArray($string)
{

    $array = explode("/",$sting);

    foreach($array as $arrA)
    {
        foreach($array as $arrB)
        {
            unset($_SESSION[$arrA][$arrB]);
        }
    }
}

现在您可以删除多个条目,例如

deleteFromArray('some_setting/some_value/a_other_value')

但请注意在 dim2array 中使用 dim1array 名称...

你可以添加更多的 foreach 或从中创建一个递归函数以深入数组

【讨论】:

  • 我想我们已经接近了!但是,我看不到此解决方案如何与多维数组一起使用,例如:delete/this/deep/value/in/config.
【解决方案3】:

您想使用唯一索引(如主 ID)删除特定数组吗?我会使用 for 循环查找该特定索引然后删除该数组...例如删除索引 = 1 的数组,请检查上面

foreach ($_SOME_ARRAY as $a => $key)//get all child arrays of '$_SOME_ARRAY '
{
   foreach($Key as $b => $key2)//get values of the child arrays
   {
        if($Key[0] == 1)// if the index at[0] equals 1
        {
            unset($arr[$a][$b]); //delete that array
        } 
   }
}

【讨论】:

  • 我对您的帖子进行了一些编辑,即使看起来像是复制粘贴到我的 psot ^^
  • 哈哈。不是真的,我不得不在上周的某个时候编写一些 lyk 代码来创建一个购物车 m,用户需要删除我保存到会话数组中的产品,bt 谢谢人
猜你喜欢
  • 2021-05-29
  • 2011-11-08
  • 2015-08-18
  • 2015-08-24
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
相关资源
最近更新 更多