我有一个3D数组。我需要提取以下内容:
- 最深层数组中唯一项的出现次数
- 最深层数组中某些项的共现次数
数组看起来像这样:
$arr = (
[0] => array([0] => array([flag][token][value])
[1] => array([flag][token][value])
)
)
我尝试使用for循环和if语句遍历数组,如下所示:
$new_arr1 = ""; // $new_arr1 = array(); //same thing, the later code doesn't work
for ($i=0; $i<count($arr);$i++)
{
for ($j=0; $j<count($arr[$i]); $j++)
{
$value= $arr[$i][$j][value];
if ($arr[$i][$j][flag] == "noun")
array_push($new_arr1, $value)
elseif ($arr[$i][$j][flag] == "verb")
array_push($new_arr2, $value)
}
}
对switch语句做了同样的事情,不能让它工作。通过进行这种条件反射,我希望将最深层数组中满足特定条件的所有值放入一个数组中,然后对它们执行*array_count_values*。这将得到以下内容:
对于标志 == "名词",value元素的值存储在$new_arr1中;对于标志 == "动词",value元素的值存储在$new_arr2中:$new_arr1 = (
[dog] => 7
[cat] => 2
[horse] => 4
);
$new_arr2 = (
[chase] => 2
[eat] => 5
[pwn] => 3
);
这将给我一个深度级数组的唯一值的计数,我不能使用*array_uniqe*函数访问。
除此之外,我还需要对这些值的共现次数进行计数,如下所示:
计算带有特定标志的令牌出现在另一个带有特定标志的令牌之前或之后的次数:
伪代码:
$count=0;
if ( (($arr[$i][$j][flag] == "noun") && ($arr[$i][$j][value] == "dog")) &&
(($arr[$i][$j+/-1][flag] == "verb") && ($arr[$i][$j+/-1][value] == "chase"))
)
$count++;
$counter = array($count = array($arr[$i][$j][value]), $arr[$i][$j+/-1][value])
基本上会给出以下内容:
counter:
array(
"7" => ([0] => "dog", [1] => "chase")
"4" => ([0] => "cat", [1] => "eat")
)
,其中"7"answers"4"是关联数组的名称,而"dog"answers"chase"是存储在另一个数组中的值。
)
我不确定我是否完全理解你的问题,但这样的东西可能会起作用:
$verb_array = array();
$noun_array = array();
foreach($arr as $index => $data){
if($data['flag'] == 'noun'){
if(isset($noun_array[$data['value']])){
$noun_array[$data['value']]++;
}
else{
$noun_array[$data['value']] = 0;
}
}
else if($data['flag'] == 'verb'){
if(isset($noun_array[$data['value']])){
$verb_array[$data['value']]++;
}
else{
$verb_array[$data['value']] = 0;
}
}
}
然后获取出现次数:
$noun_count = count($noun_array);
$verb_count = count($verb_array);
如果需要特定项的计数,它将存在于数组中。