php从数组中删除值

时间:2012-06-19 02:58:18

标签: php arrays

您好我需要帮助使用递归函数从数组中删除值

$array = [0] => testing,testing1
[1] => testing,testing1,testing2
[2] => testing,testing1,testing2,testing3
[3] => testing,testing1,testing2,testing3,tesing4
[4] => testing,testing1,testing2,testing3,tesing4
[5] => testing,testing1,testing2,testing3,tesing4
[6] => testing,testing1,testing2,testing3,tesing4
[7] => testing,testing1,testing2,testing3,tesing4

我需要检查数组计数,即if count(array[0]) == count(array[1]),then reutrn array else unset(array[value]);

从上面的数组我必须删除array[0],[1],[2]并返回其余的数组值。

我已尝试过以下代码

$idx =10;
$separtor =',';
function array_delete($idx, $array,$separtor) {
  $finalvalue = array();
for ($i = 0; $i < $idx; $i++) {
   $values = explode($separtor, $array[$i]);
   $valuesnext = explode($separtor, $array[$i+1]);
       if(count($values) != count($valuesnext) )
       {
            unset($array[$i]);
           // reset($array);
           // array_delete($idx, $array,$separtor);
            if (is_array($array)) $array = array_delete($idx, $array,$separtor);
            $finalvalue =  $array;
       }else
       {

       }
    //echo $i;

}
return $finalvalue;
//(is_array($array)) ? array_values($array) : null;
//array_delete($idx, $array,$separtor);
}

我正在Notice: Undefined offset: 0 when trying calling recursive, going to infinite loop

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望过滤数组,使得最终数组中的任何值与源数组中的最后一个元素的长度相同。为了避免在迭代时改变数组,该技术使用符合条件的元素构建一个新数组。

$matchLength = count($mainArray[count($mainArray) - 1]);
$resultArray = array();
for($i = 0; $i < count($mainArray); $i++) {
    if(count($mainArray[$i]) == $matchLength) {
        $resultArray[] = $mainArray[$i];
    }
}

如果您正好使用PHP 5.3或更高版本,则可以使用闭包和array_filter更快地完成此操作:

$matchLength = count($mainArray[count($mainArray) - 1]);
$resultArray = array_filter($mainArray, function($element){return count($element) == $matchLength});

仔细检查代码,我最近没有编写PHP,所以这只是一个想法。

答案 1 :(得分:1)

根据你给出的描述,可以做出(检查当前和前一个的计数,如果它们不匹配,则删除前一个)。

实施例/ Demo

unset($prevKey);
$count = array();
foreach (array_keys($array) as $key) {
    $count[$key] = count($array[$key]);
    if (isset($prevKey) && $count[$prevKey] !== $count[$key]) {
        unset($array[$prevKey]);
    }
    $prevKey = $key;
}

如果您需要重新考虑将删除考虑在内,可以使用一点goto来完成工作Demo

start:
######
unset($prevKey);
$count = array();
foreach (array_keys($array) as $key) {
    $count[$key] = count($array[$key]);
    if (isset($prevKey) && $count[$prevKey] !== $count[$key]) {
        unset($array[$prevKey]);
        goto start;
        ###########
    }
    $prevKey = $key;
}

答案 2 :(得分:1)

您想保留拥有最多项目的子阵列吗?您的描述似乎是这样说的。

如果是这样,以下内容就足够了。

// Get maximum number of items in the arrays
$max_count = max(array_map('count', $array));

// Keep only those arrays having $max_count items
$filtered  = array_filter($array, function ($a) use ($max_count) {
    return count($a) === $max_count;
});

除此之外:如果您需要过滤后的数组具有从零开始的密钥,请在其上调用array_values()

请参阅an example running online