PHP数组根据值中的前置文本进行过滤

时间:2018-09-04 03:37:11

标签: php arrays filtering

我有一个像下面的数组

Array
(
    [0] => country-indonesia
    [1] => country-myanmar
    [2] => access-is_airport
    [3] => heritage-is_seagypsy
)

在该数组中,我只想为[country],[access]和[heritage]制作单独的数组

因此,我必须按'-'之前的文本检查数组值。我不确定该怎么做。所以我不能在这里应用代码。我只有PHP中的数组

5 个答案:

答案 0 :(得分:2)

修改后的答案,如果您只想获取特定的类型。

<?php

$arr = [
  'country-indonesia',
  'country-myanmar',
  'access-is_airport',
  'heritage-is_seagypsy',
];

$new_array = [];
$types = ['country', 'heritage', 'access'];

foreach ($arr as $element) {
  $fac = explode('-', $element);
  foreach ($types as $type) {
    if ($fac[0] === $type) {
      $new_array[$type][] = $fac[1];
    }
  }
}

$country = $new_array['country'];
$access = $new_array['access'];
$heritage = $new_array['heritage'];


var_dump($new_array);

答案 1 :(得分:2)

使用array_walk

的3行代码的简单解决方案
<?php

$arr = [
    'country-indonesia',
    'country-myanmar',
    'access-is_airport',
    'heritage-is_seagypsy',
];

$new_array = [];
array_walk($arr, function($item) use (&$new_array){
    //if(false === strpos($item, '-')) return;
    list($key,$value) = explode('-', $item, 2);
    $new_array[$key][] = $value;
});


print_r($new_array);

给出以下输出:

Array
(
    [country] => Array
        (
            [0] => indonesia
            [1] => myanmar
        )

    [access] => Array
        (
            [0] => is_airport
        )

    [heritage] => Array
        (
            [0] => is_seagypsy
        )

)

如果您不希望出现重复的空条目:

<?php

$arr = [
    'country-indonesia',
    'country-myanmar',
    'access-is_airport',
    'heritage-is_seagypsy',
];

$new_array = [];
array_walk($arr, function($item) use (&$new_array){
    if(false === strpos($item, '-')) return;
    list($key,$value) = explode('-', $item, 2);
    if(empty($value) || array_key_exists($key, $new_array) && in_array($value, $new_array[$key])) return;
    $new_array[$key][] = $value;
});


print_r($new_array);

答案 2 :(得分:1)

您可以使用explodein_array函数

 <?php
   $arr = ["country-indonesia","country-myanmar","access-is_airport","heritage-is_seagypsy"];
  $newArr = array();
   foreach($arr as $k=> $val){
      $valArr = explode("-", $val);
        if(!in_array($valArr[0], $newArr)){
           $newArr[] = $valArr[0];
        }
   }

   print_r($newArr);

  ?>

live demo

答案 3 :(得分:0)

您需要PHP的strpos()函数。 只需遍历数组的每个元素,然后尝试类似的操作即可:

if( strpos($array[$i], "heritage") != false )
{
    // Found heritage, do something with it
}

(喂养婴儿时用手机写的一个粗略例子,可能有错别字,但这是您所需要的基本知识)

在此处进一步阅读:http://php.net/manual/en/function.strpos.php

答案 4 :(得分:0)

//first lets set a variable equal to our array for ease in working with i.e
// also create a new empty array to hold our filtered values 
$countryArray = array();
$accessArray = array();
$heritageArray = array();

$oldArray = Array(country-indonesia, country-myanmar, access-is_airport, heritage-is_seagypsy);

//Next loop through our array i.e

for($x = 0; $x < count($oldArray); $x++){
// now filter through the array contents
$currentValue = $oldArray[$x];
// check whether the current index has any of the strings in it  [country] ,[access], [heritage] using the method : strpos()

if(strpos($currentValue,'country')){
//if this particular value contains the keyword push it into our new country array //using the array_push() function.
array_push($countryArray,$currentValue);
}elseif(strpos($currentValue,'access')){
  // else check for the access string in our current value
  // once it's found the current value will be pushed to the $accessArray
array_push($accessArray,$currentValue);
}elseif(strpos($currentValue,'heritage')){
 // check for the last string value i.e access. If found this too should be pushed to //the new heritage array i.e
array_push($heritageArray,$currentValue);
}else{
// do nothing
}
}

///我认为应该有效:欢呼希望