我有这个数组:
$data = [
[
"id"=>1,
"data"=>"data 1",
],
[
"id"=>2,
"data"=>"data <4>",
],
[
"id"=>3,
"data"=>"data 3",
],
[
"id"=>4,
"data"=>"<3>",
]
];
我想生产一种新的array.生成的数组应为:
[
{
"id": 1,
"data": "data 1"
},
{
"id": 2,
"data": "data data 3"
},
{
"id": 3,
"data": "data 3"
},
{
"id": 4,
"data": "data 3"
}
]
其思想是,每当data
属性中有<number>
时,该值应该被具有相同id
的元素中的data
属性所替换.在上面的示例中,最后一个元素是:
[
"id"=>4,
"data"=>"<3>",
]
因此,我们用data 3
替换<3>
,因为它是用id:3
存储在Element的data
属性中的.
我已经创建了一个使用上述数组的函数:
public function refProcess($data, &$newData, $i, &$tmpData){
$dataLength = count($data);
if($i>=$dataLength){
return;
}
for(;$i<$dataLength;$i++){
if(is_null($tmpData)){
$tmpData = ['id'=> $data[$i]['id'], 'data'=>null];
}
if(strpos($data[$i]['data'],"[")!==false){
$parsed = $this->getInbetweenStrings("<", ">", $data[$i]['data']);
if(count($parsed)){
foreach($parsed as $occurance){
foreach($data as $key => $dataValue){
if($dataValue['id']==$occurance){
if(strpos($dataValue['data'], "<")!==false){
$this->refProcess($data, $newData, $key, $tmpData);
$tmpData=null;
}
else{
$tmpDataAtt = str_replace("<".$occurance.">", $dataValue['data'], $data[$i]['data']);
$tmpData['data'] = $tmpDataAtt;
$newData [] = $tmpData;
$tmpData = null;
break;
}
}
}
}
}
}
else{
$tmpData['data'] = $data[$i]['data'];
$newData [] = $tmpData;
$tmpData = null;
}
}//foreach
}
//returns an array contains strings existing between $start and $end. Multiple occurance
public function getInbetweenStrings($start, $end, $str){
$matches = array();
$regex = "/$start([a-zA-Z0-9_]*)$end/";
preg_match_all($regex, $str, $matches);
return $matches[1];
}
它工作得很好.但问题是,一旦我向数组中添加了另一个元素:
$data = [
[
"id"=>1,
"data"=>"data 1",
],
[
"id"=>2,
"data"=>"data <4>",
],
[
"id"=>3,
"data"=>"data 3",
],
[
"id"=>4,
"data"=>"<3>",
],
[
"id"=>5,
"data"=>"<2>",
]
];
元素为id:5
,则函数进入死循环.我遗漏了什么?
该代码可以在https://onlinephp.io/c/0da5d℃进行测试