PHP数组按值从pre-text过滤

问题描述 投票:0回答:5

我有一个像下面的数组

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

从那个数组我想为[country],[access],[heritage]制作单独的数组

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

php arrays filtering
5个回答
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);

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);

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


0
投票

你需要PHP的strpos()功能。只需循环遍历数组的每个元素,尝试以下方法:

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

(在喂宝宝的同时用我的手机写的粗略示例,可能有拼写错误,但这是你需要的基础知识)

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


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

//我相信应该有用:欢呼希望

© www.soinside.com 2019 - 2024. All rights reserved.