PHP匹配数组中的字符串,修改字符串然后创建新数组

时间:2014-09-25 03:38:16

标签: php arrays

我不确定如何更好地表达我的问题,但这是我的情况。

我有一个如下数组:

$temp_array = array("111111-Name1-122874|876394|120972", "222222-Name2-122874|876394|120972", "333333-Name3-122874|876394|120972");

我需要循环遍历此数组并尝试匹配数组中每个字符串的第一部分

e.g。

$id          = "222222";
$rand_number = "999888";
if ($id match the first element in string) {
     fetch this string
     append "999888" to "122874|876394|120972"
     insert this string back to array
}

结果数组变为:

$temp_array = array("111111-Name1-122874|876394|120972", "222222-Name2-999888|122874|876394|120972", "333333-Name3-122874|876394|120972");

很抱歉,如果我的问题看起来令人困惑,但我甚至很难掌握一些必要的操作。

由于

4 个答案:

答案 0 :(得分:2)

粗略回答 - 它将取决于初始ID的预期值。如果它们可能更长或更短,则在连字符上爆炸而不是使用substr

    $temp_array = array("111111-Name1-122874|876394|120972","222222-Name2-122874|876394|120972","333333-Name3-122874|876394|120972");

    $id = "222222";
    $rand_number = "999888";

    foreach($temp_array as $t){
        if(substr(0,6,$t)==$id){
            $new[] = $t.'|'.$rand_number;
        }else{
            $new[] = $t;
        }
    }

答案 1 :(得分:2)

在这种情况下你也可以使用一些爆炸:

$temp_array = array("111111-Name1-122874|876394|120972", "222222-Name2-122874|876394|120972", "333333-Name3-122874|876394|120972");
$id = "222222";
$rand_number = "999888";
foreach($temp_array as &$line) {
                    // ^ reference
    $pieces = explode('|', $line); // explode pipes
    $first = explode('-', array_shift($pieces)); // get the first part, explode by dash
    if($first[0] == $id) { // if first part is equal to id
        $first[2] = $rand_number; // replace the third part with random
        $first = implode('-', $first); // glue them by dash again
        $line = implode('|', array($first, implode('|',$pieces))); // put them and glue them back together again
    }
}
echo '<pre>';
print_r($temp_array);

答案 2 :(得分:2)

试试这个:

$temp_array = array("111111-Name1-122874|876394|120972", "222222-Name2-122874|876394|120972", "333333-Name3-122874|876394|120972");
$id          = "222222";
$rand_number = "999888";

// Loop over each element of the array
// For each element, $i = the key, $arr = the value
foreach ($temp_array as $i => $arr){

    // Get the first characters of the element up to the occurrence of a dash "-" ...
    $num = substr($arr, 0, strpos($arr, '-'));

    // ...and check if it is equal to $id...
    if ($num == $id){
        // ...if so, add $random_number to the back of the current array element
        $temp_array[$i] .= '|'  . $rand_number;
    }
}

输出:

Array
(
    [0] => 111111-Name1-122874|876394|120972
    [1] => 222222-Name2-122874|876394|120972|999888
    [2] => 333333-Name3-122874|876394|120972
)

See demo

注意:正如Dagon在评论中指出的那样,您的问题是附加,但您的示例显示的数据是 prepended 。此方法附加,但可以根据需要进行更改。


http://php.net/manual/en/control-structures.foreach.php

http://php.net/manual/en/function.substr.php

http://php.net/manual/en/function.strpos.php

答案 3 :(得分:2)

使用array_walk

的另一个版本
$temp_array = array("111111-Name1-122874|876394|120972", "222222-Name2-122874|876394|120972", "333333-Name3-122874|876394|120972");

$id          = "222222";
$rand_number = "999888";
$params = array('id'=>$id, 'rand_number'=>$rand_number);
array_walk($temp_array, function(&$value, $key, $param){
    $parts = explode('-', $value); // Split parts with '-' so the first part is id
    if ($parts[0] == $param['id']){
        $parts[2]="{$param['rand_number']}|{$parts[2]}"; //prepend rand_number to last part
        $value=implode('-',$parts); //combine the parts back
    }
},$params);

print_r($temp_array);

如果你只想追加代码变得更短

$params = array('id'=>$id, 'rand_number'=>$rand_number);
array_walk($temp_array, function(&$value, $key, $param){
    // here check if the first part of the result of explode is ID 
    // then append the rand_number to the value else append '' to it.
    $value .= (explode('-', $value)[0] == $param['id'])? "|{$param['rand_number']}" : '';
},$params);

编辑:评论已添加到代码中。