代码之家  ›  专栏  ›  技术社区  ›  Thomas Owens

是否有一个PHP函数可以从数组中删除任何/所有具有特定值的键/值对?

  •  0
  • Thomas Owens  · 技术社区  · 16 年前

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

    我有一个数组(在我的例子中,是数字索引的),我想扫描一个特定的值,如果它存在,就删除它。然后,当该值的所有实例都被删除后,我想使用 array_values .

    5 回复  |  直到 14 年前
        1
  •  6
  •   Konrad Rudolph    16 年前

    array_diff 是你想要的。

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

    结果: "blue" .

        2
  •  2
  •   seanyboy    16 年前

    只是为了增加…

    数组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
  •  0
  •   Jrgns    16 年前

    我喜欢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
  •  0
  •   Jon    16 年前

    数组过滤器为你做这个。您只需要提供一个过滤器回调函数:

    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"
    }
    

    对于要保留的值,filter函数应返回true;对于要删除的值,filter函数应返回false。然后继续使用array_值重新索引数组。例如

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

    如果在对象内执行此操作,并且希望在对象内调用筛选方法,则可以使用此表单进行回调:

    array_filter($Values, array($this,'myFilter'));
    
        5
  •  0
  •   Igor M. - PortalPress.org    14 年前

    重建这个“不可能”的功能,我建议:
    函数pf ou cleanarray($arrayToClean=false,$to ou explode=false,$delimiter=false){ /*portalpress.org 2011[请保留此注释]-将数组清理为空或生成包含内容的数组;小心使用,最好不要根据[关联]数组的长度使用偶数数组。


    我知道,它看起来很糟糕,尤其是在stackoverflow上没有缩进。但在重建时,它可以是一个非常有用的动态工具,只使用最简单的函数,因此您可以在多个数组上随意操作键和值。关键功能是删除空值或使用explode创建一个数组,这是干净的,但只要稍微有点麻烦,它就可以成为一个根据键或值消除元素的函数。- Igor 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]=>)))))
    结果:
    数组([0]=>数组([0]=>数组([0]=>数组([0]=>数组([0]=>数组([0]=>a)))))
    [1]=>数组([0]=>数组([0]=>数组([0]=>数组([0]=>数组([0]=>a)))))))
    */
    如果($arraytoClean==0$arraytoClean){
    如果(!)是数组($arraytoClean))。{
    如果($to ou explode&$delimiter){
    $arrayToClean=分解($delimiter,$arrayToClean);
    }否则{
    $arrayToClean=数组($arrayToClean);
    }
    }
    NZX=0;
    $keyArray=数组键($arrayToClean);
    对于($ NYX=0;$YNX) $KigDe=真;
    如果($keyarray[$nyx]!= = $ NYX){
    $keyDigit=假;
    断裂;
    }
    }
    对于($ NYX=0;$YNX) 如果(!)是数组($arrayToClean[$keyArray[$nyx]]))。{
    如果($arrayToClean[$keyArray[$nyx]]){
    如果(!)ISset($retarraytoClean))。{
    $retarrayToClean=array();
    }
    $retarrayToClean[($keyDigit)?$nzx:$keyarray[$nyx])]=$arrayToClean[$keyarray[$nyx]];
    $NZX++;
    }
    }否则{
    $temparr=pf ou cleanarray($arrayToClean[$keyarray[$nyx]]);
    如果($TEMPARR){
    如果(!)ISset($retarraytoClean))。{
    $retarrayToClean=array();
    }
    $retarrayToClean[($keyDigit)?$nzx:$keyarray[$nyx])]=$temparr;
    $NZX++;
    }
    }
    }
    }
    如果(isset($retarraytoclean))。{
    退货($retarrayToClean);
    }否则{
    返回(NULL);
    }
    }