我有一个3D数组。我需要提取以下内容:
Array看起来像这样:
$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 *。这会给我以下内容:
for flag ==“noun”,存储在$ new_arr1中的 value 元素的值,以及 flag ==“verb”,存储在$ new_arr2中的 value 元素的值:
$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”和“4”是关联数组的名称,而“dog”和“chase”是存储在另一个数组中的值。
)
答案 0 :(得分:2)
我不确定我是否100%关注您的问题,但这样的事情可能有效:
$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);
如果您需要特定项目的计数,它将存在于数组内部。