【问题标题】:Find element by value in array and unset element在数组中按值查找元素并取消设置元素
【发布时间】:2020-03-24 22:33:13
【问题描述】:

我有下一个数组结构:

Array
(
    [0] => Array
        (
            [45] => Array
                (
                    [0] => 1 day
                )

        )

    [1] => Array
        (
            [45] => Array
                (
                    [0] => - None -
                )

        )

)

我需要通过值 '- None -' 找到一个元素并完全取消设置下一个元素:

[1] => Array
        (
            [45] => Array
                (
                    [0] => - None -
                )

        ) 

大家有什么想法吗?

【问题讨论】:

  • None是否只能出现在最深层次的数组中?
  • 只需通过迭代找到它并取消设置$i + 1。我在这里看不到递归。
  • @Breus 这是默认结构。只有这种情况。
  • @JustName 取消设置下一个元素是什么意思?另外,您可以在帖子中显示数组的 var_export() 吗?
  • “有什么想法吗,伙计们?” - 一般的想法是你去阅读一些基础知识,这样你就可以尝试 你自己。 “并完全取消设置下一个元素” - “下一个”,您在这里似乎实际上是指“上一个”......?

标签: php arrays algorithm


【解决方案1】:

你可以试试这个(我在一个数组上做了这个,因为我不知道你的逻辑到底是什么)。

$found = false;
foreach($elems as $elem){
    if($found){
        unset($elem);
        $found = false;
    }
    $found = ($elem == " - None");   
}

【讨论】:

  • 这是一个奇怪的解决方案。 $found 在条件下不可用,$elem 在条件后也不可用。
  • 什么意思?你有范围问题? $found 在整个范围内都是已知的,而 $elem 在 foreach 中是已知的,所以我看不出有什么困扰你。您只需将上一次迭代的值存储在 $found 中。
  • @Minirock " - None" 可以更深层次。不一定在第一层。
  • 好吧,这个问题并不是很清楚,它只是在它上面添加了一个循环级别。这个答案背后的想法只是为了展示如何记住以前的元素是为了知道你是否需要删除。我们也不知道他是要删除当前数组还是顶层数组中的下一个元素。
【解决方案2】:

尝试使用下一个foreach循环:

foreach($ar as $key=>$row){
    foreach($row as $ind=>$val){
        if ($val[0] == '- None -') unset($ar[$key]);
    }
}

Demo

如果是true,它将检查最低级别的值和unsets。

【讨论】:

    【解决方案3】:

    我们可以使用简单的递归策略来深度删除- None - 值并将truefalse 返回到父级循环。

    如果我们从子级别收到true,我们unset()当前级别数组中的当前索引。如果我们收到false,一切都会正常进行。

    <?php
    
    function removeNoneElements(&$arr){
        $temp = $arr;
        $hasNone = false;
        foreach($temp as $index => $val){
            if(is_array($val)){
                $containsNone = removeNoneElements($val);
                if($containsNone){
                    $hasNone = true;
                    unset($arr[$index]);
                }
            }else if($val === '- None -'){
                unset($arr[$index]);
                $hasNone = true;
            }
        }
    
        return $hasNone;
    }
    

    演示: https://3v4l.org/N3AP3

    【讨论】:

    • 这是一个有效的解决方案,但 Aksen P 的解决方案也有效,但很短。
    猜你喜欢
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 2018-07-16
    • 2011-02-20
    • 2014-09-21
    • 2013-04-11
    • 2021-08-13
    • 2020-07-08
    相关资源
    最近更新 更多