如何过滤数组php

时间:2019-06-24 13:53:35

标签: php

我正在尝试通过以下一种条件获取数组的底值:

获取所有数字值,直到下一个值是字符串,然后停止指令,并保留所有其他值,即使它们是数字

<? php   $data= [1,2,3,'web',4,5,6,'web',7,8,9]; ?>

输出将是:7,8,9

6 个答案:

答案 0 :(得分:0)

您可以使用array_reverse从具有相反顺序元素的数组中获取值。

$reversed = array_reverse($data);

然后解析数组以停止在获取字符串的地方

foreach($reversed as $value) {
    if(is_string($value)) {
      break;
    }
    $output[] = $value; 
}

//print_r($output); // to print the output array. This will return the values like 9, 8, 7

// do a reverse again to get the values in the format you want.

$final= array_reverse($output);

print_r($final); // to print the final array. This will return the values like 7, 8, 9

这里是DEMO

答案 1 :(得分:0)

尝试一下,如果值是整数,我将值存储在数组$newArray中。如果在值中找到字符串,只需重置数组$newArray

<?php
$data = [1,2,3,'web',4,5,6,'web',7,8,9]; 
$newArray = array(); // resultant array
foreach ($data as $key => $value) {
    if(is_int($value)){
        $newArray[] = $value;
    }
    else{
        $newArray = array();    // reset if not integer
    }
}
echo "<pre>";
print_r($newArray);
?>

DEMO

结果:

Array
(
    [0] => 7
    [1] => 8
    [2] => 9
)

现在,您可以将implode()用于逗号分隔的结果,例如:

echo implode(",",$newArray); // 7,8,9

编辑:(08-07-2019)

如果是示例

$data = [1,2,3,'web',4,5,6,'web',7,8,9,'web']; 

代码:

<?php
$data = [1,2,3,'web',4,5,6,'web',7,8,9,'web']; 
$newArray = array(); // resultant array

end($data);
$keyLast = key($data);  // fetches the key of the element pointed to by the internal pointer

foreach ($data as $key => $value) {
    if(is_int($value) ){
        $newArray[] = $value;
    }
    else{
        if($keyLast === $key) { // if last key is string overwrite the previous array.
            $newArray = $newArray;
        }
        else{
            $newArray = array();    // reset if not integer
        }        
    }
}
echo "<pre>";
print_r($newArray);
?>

编辑:

最好将所有整数值存储到数组中,然后使用array_slice()从新的整数数组中获取三个元素,例如:

<?php
$data = [1,2,3,'web',4,5,6,'web',7,8,9,'web','web','web']; 
$newArray = array(); // resultant array
foreach ($data as $key => $value) {
    if(is_int($value) ){
        $newArray[] = $value;
    }    
}
$lastThreeElement = array_values(array_slice($newArray, -3, 3, true));
echo "<pre>";
print_r($lastThreeElement);
?>

答案 2 :(得分:0)

我们可以尝试首先过滤以查找第一个非数字条目。然后,从该索引开始,对数组进行子集化。最后,再次过滤子集以删除所有非数字元素。

$data= [1,2,3,'web',4,5,6,'web',7,8,9];
$sub_data = array_filter($data, function($item) { return !is_numeric($item); });
$index = array_search(current($sub_data), $data);
$sub_data = array_slice($data, $index);
$sub_data = array_filter($sub_data, function($item) { return is_numeric($item); });
print_r($sub_data);

此打印:

Array
(
    [1] => 4
    [2] => 5
    [3] => 6
    [5] => 7
    [6] => 8
    [7] => 9
)

答案 3 :(得分:0)

我不知道是否有特定功能,但是我得到了相同的结果

$data= [1,2,3,'web',4,5,6,'web',7,8,9];
foreach ($data as $key => $value) {
  if($value=="web"){
    $x =$key;
  }
}
$data = array_slice($data,$x);
print_r($data);

输出:

Array ( [0] => web [1] => 7 [2] => 8 [3] => 9 ) 

答案 4 :(得分:0)

您可以只从最后弹出值,直到获得非整数的值。

while (is_int($n = array_pop($data))) {
    $result[] = $n;
}

这将修改数据数组,因此,如果您需要保留原始值,请复制一份。

答案 5 :(得分:0)

您要进行的测试取决于示例数据是否具有代表性,并且数组中所需的所有数值均为int类型,或者某些数值字符串。

$data= [1,2,3,'web',4,5,6,'web',7,8,9];
$result = [];
for($i = count($data)-1; $i >= 0; $i++) {
    // If some of the values you want might be numeric strings
    // (e.g. "7") or decimals (e.g. 1.5), use this
    if(!is_numeric($data[$i])) {
        break;
    }
    // If your values will only be integer type, use this
    if(!is_int($data[$i])) {
        break;
    }
    array_unshift($result,$data[$i]);
}

// If you want the results in original order
print_r($result);  // Output: [7,8,9]

// If you want the results inverted
$result = array_reverse($result);
print_r($result);  // Output: [9,8,7]