使用另一个对象数组过滤对象数组,然后将结果分组为索引数组的索引数组

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

我有一个多维数组,我想在 for 循环中打印它。第一个数组维度 E.g

$arrayName[0]
的数组大小为 2,键从
0 => value1
开始,然后是
1 => value2
。然后
$arrayName[1]
的数组大小也为 2,但键从第一个数组维度按顺序开始,看起来像这样
2 => value3
3 => value4
。除了 2 和 3 个键之外,有没有办法可以将其设为 0 和 1,因为它是另一个第二数组维度?请在这件事上给予我帮助。谢谢。请看下面的图片。

我想要这样

for ($i = 0; $i < count($qualified_applicants); $i++) { 
    for ($j = 0; $j < count($appExp); $j++) { 
        if ($qualified_applicants[$i]->id == $appExp[$j]->applicant_id){
            $temp[$appExp[$j]->applicant_id][$j] = $appExp[$j]->work.', '.$appExp[$j]->company_name.' - '.date("F j, Y", strtotime($appExp[$j]->start_date)).' - '.date("F j, Y", strtotime($appExp[$j]->end_date));
        } else {
            //                          
        }
    }
    # code...
}

上面是我创建多维数组的代码。

php arrays multidimensional-array filtering grouping
2个回答
1
投票
$arr1 = array(
    array(
        "i m first value of 0th array",
        "i m Second value of 0th array"
    ), 
    array(
        2 => "I m first value of 1st array but my key started with 2 and i want to start it with 0", 
        3 => "I m Second value of 1st array but my key is 3 and i want to set it with 1"
    )
);
echo "<pre>";
print_r($arr1); // array before

// above is you array i as understand

$newFormattedArray = array();

foreach($arr1 as $key => $value){
    $newFormattedArray[$key] = array_values($value); // array_values() will set the order in asc, starts with 0
}
echo "<pre>";
print_r($newFormattedArray); // array after

0
投票

与其添加另一个循环来在每个子数组上调用

array_values()
(记录可以是
array_map('array_values', $yourArray)
),不如重构和简化您的初始过滤和分组方法。

$qualified_applicants
数组创建一个查找数组,因为它在逻辑上仅具有唯一的
id
值。

然后您可以通过检查每个

$appExp
是否符合条件来避免运行嵌套循环。在结果数组中使用临时键将保持预期的分组。循环完成后,调用
array_values()
重新索引第一级键。

代码:(演示

$lookup = array_flip(array_column($qualified_applicants, 'id'));
$result = [];
foreach ($appExp as $obj) {
    if (isset($lookup[$obj->applicant_id])) {
        $result[$obj->applicant_id][] = sprintf(
            '%s, %s - %s - %s',
            $obj->applicant_id,
            $obj->work,
            $obj->company_name,
            date("F j, Y", strtotime($obj->start_date)),
            date("F j, Y", strtotime($obj->end_date))
        );
    }
}
var_export(array_values($result));
© www.soinside.com 2019 - 2024. All rights reserved.