【问题标题】:Is there a PHP function to remove any/all key/value pairs that have a certain value from an array?是否有 PHP 函数可以从数组中删除任何/所有具有特定值的键/值对?
【发布时间】:2010-09-18 12:59:24
【问题描述】:

我认为这样的问题是我不喜欢使用 PHP 的原因。手册很好,如果你能找到你要找的东西。在阅读了Array Functions 之后,我没有看到提供我需要的功能。

我有一个数组(在我的例子中是数字索引的),我想扫描它以查找特定值,如果存在,请将其删除。然后,当该值的所有实例都被删除后,我想使用 array_values 重新排列数组。

【问题讨论】:

  • 我很好奇为什么这被否决了......
  • 是的,我也是。也许是因为您对语言的隐含批评……啊。

标签: php arrays


【解决方案1】:

array_diff 是你想要的。

$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);

结果:"blue"

【讨论】:

  • 谢谢。我认为如果将其称为 array_prune、array_remove 或其他更具描述性的名称会有所帮助。再次感谢。
  • 我同意 PHP(数组)函数名称有些随意且不一致。我自己经常花很多时间寻找合适的功能。
  • 特别是当我没有打开每个功能并阅读详细信息时。我什至从“计算数组的差异”中都不知道这个函数返回了一个数组,所以我放弃了它并继续阅读。我认为它可能会返回一个整数差异,例如数组之间的 levenshein (sp?) 距离。
  • 是的 - 我认为它会给出仅出现在一个数组中的所有元素的结果。好像没有。
【解决方案2】:

只是添加到这个...

array_diff 似乎显示了第一个数组中没有出现在第二个数组中的元素。它不显示仅出现在一个或另一个数组中的那些元素。

例如

<?
$test = "hello";
$array1 = array("a" => "green", "red", "bicycle", "red");
$array2 = array("b" => "green", "yellow", "red", "blue", "yellow", "pink");
$result = array_diff($array1, $array2);
print_r ($result);
?> 

返回

Array
(
    [1] => bicycle
)

【讨论】:

    【解决方案3】:

    我喜欢 array_diff 函数,但如果你不想传递数组,我有一个脚本:

    function array_unset_value($value, &$array) {
        $key = array_search($value, $array);
        while ($key !== false) {
            unset($array[$key]);
            $key = array_search($value, $array);
        }
    }
    

    【讨论】:

      【解决方案4】:

      array_filter 为您执行此操作。你只需要提供一个过滤回调函数:

      function myFilter($Value){
         if($Value == 'red'){
            return false;
         }
         return true;
      }
      
      $Values = array("a" => "green", "red", "bicycle", "red");
      
      $Values = array_filter($Values, 'myFilter');
      

      返回:

      array {
        ["a"] => "green"
        [1]   => "bicycle"
      }
      

      过滤器函数应该为您想要保留的值返回 true,对于您想要删除的值返回 false。然后继续使用 array_values 重新索引数组。例如

      $Values = array_values(array_filter($Values, 'myFilter'));
      

      如果您在一个对象中执行此操作,并且您想在该对象中调用过滤器方法,您可以使用此表单进行回调:

      array_filter($Values, array($this,'myFilter'));
      

      【讨论】:

        【解决方案5】:

        重建这个“不可能”的功能,我建议:
        函数 pf_cleanarray($arraytoclean=false,$to_explode=false,$delimiter=false) { /* PortalPress.org 2011 [请保留此评论] - 将数组清理为 NULL 或创建包含内容的数组;谨慎使用,最好不要使用取决于 [关联] 数组的偶数长度


        我知道,它看起来很糟糕,尤其是在 Stackoverflow 上没有缩进。但是在重建时,它可能是一个非常有用的动态工具,只使用最简单的函数,因此您将能够在多数组上随意操作键和值。 keyfunction是删除空值或者用explode做一个数组,很干净,但是有点麻烦,可以做成一个函数,根据key或者value去掉元素。 - 伊戈尔 M. -

        简单示例:
        $A[0][0][0][0][0][0]="A";
        $A[1][0][0][0][0][0]="";
        $A[2][0][0][0][0][0]="";
        $A[0][0][0][0][0][1]="";
        $A[1][0][0][0][0][1]="";
        $A[2][0][0][0][0][1]="";
        $A[0][0][0][0][0][2]="";
        $A[1][0][0][0][0][2]="";
        $A[2][0][0][0][0][2]="";
        $A[0][0][0][0][0][3]="";
        $A[1][0][0][0][0][3]="";
        $A[2][0][0][0][0][3]="";
        $A[0][0][0][0][0][4]="";
        $A[1][0][0][0][0][4]="";
        $A[2][0][0][0][0][4]="";
        $A[0][0][0][0][0][5]="";
        $A[1][0][0][0][0][5]="A";
        $A[2][0][0][0][0][5]="";
        $A 数组: 数组([0]=>数组([0]=>数组([0]=>数组([0]=>数组([0]=>数组([0]=>A[1]=>[2] ]=>[3]=>[4]=>[5]=>)))))
        [1]=>数组([0]=>数组([0]=>数组([0]=>数组([0]=>数组([0]=>[1]=>[2]=> [3]=>[4]=>[5]=>A)))))
        [2]=>数组([0]=>数组([0]=>数组([0]=>数组([0]=>数组([0]=>[1]=>[2]=> [3]=>[4]=>[5]=>))))))
        结果 $A:
        数组([0]=>数组([0]=>数组([0]=>数组([0]=>数组([0]=>数组([0]=>A))))))
        [1]=>Array([0]=>Array([0]=>Array([0]=>Array([0]=>Array([0]=>A)))))))
        */
        if($arraytoclean===0 || $arraytoclean) {
        if(!is_array($arraytoclean)) {
        if($to_explode && $delimiter) {
        $arraytoclean=explode($delimiter,$arraytoclean);
        } 其他 {
        $arraytoclean=Array($arraytoclean);
        }
        }
        $nZx=0;
        $keyarray=array_keys($arraytoclean);
        for($nYx=0;$nYx $keydigit=true;
        if($keyarray[$nYx]!==$nYx) {
        $keydigit=false;
        休息;
        }
        }
        for($nYx=0;$nYx if(!is_array($arraytoclean[$keyarray[$nYx]])) {
        if($arraytoclean[$keyarray[$nYx]]) {
        if(!isset($retarraytoclean)) {
        $retarraytoclean=数组();
        }
        $retarraytoclean[(($keydigit) ? $nZx : $keyarray[$nYx])]=$arraytoclean[$keyarray[$nYx]];
        $nZx++;
        }
        } 其他 {
        $temparr=pf_cleanarray($arraytoclean[$keyarray[$nYx]]);
        if($temparr) {
        if(!isset($retarraytoclean)) {
        $retarraytoclean=数组();
        }
        $retarraytoclean[(($keydigit) ? $nZx : $keyarray[$nYx])]=$temparr;
        $nZx++;
        }
        }
        }
        }
        if(isset($retarraytoclean)) {
        返回($retarraytoclean);
        } 其他 {
        返回(NULL);
        }
        }

        【讨论】:

        • M - 缩进代码 4 个空格或选择并使用 {} 按钮。有关更多信息,请参阅降价 help
        • 我尝试编辑您的代码以进行格式化,但.. 不能。此外,不需要像 /* PortalPress.org 2011 [maintain this comment, please] */ 这样的 cmets,因为使用 Stack Overflow 中的 anything 需要根据我们的许可条款进行归属。如果有人使用此代码,他们必须链接到此答案以及您的用户页面。无需引入额外的限制。
        猜你喜欢
        • 2018-09-26
        • 1970-01-01
        • 2016-07-13
        • 1970-01-01
        • 2020-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多