解析多维PHP数组以删除重复键值

时间:2015-02-26 18:16:03

标签: php arrays multidimensional-array

有一些问题解析我的多维php数组并删除重复项。我花了四个小时试图弄明白我做错了什么都没有运气。如果有人可以帮助我,那就太好了。

多维数组的格式: Array(Array("id"=>?, "step_num"=>?, "desc"=>?))

示例数据集:

Array(
[0]=> Array([id]=>1, [step_count]=>1, [desc]=>"Something"),
[1]=> Array([id]=>2, [step_count]=>1, [desc]=>"Something New"),
[2]=> Array([id]=>3, [step_count]=>1, [desc]=>"Something Newest")
)

以下是我尝试通过比较id值来尝试仅使用最新desc的step_count :( $subStepsFound具有与上述数组相同的格式,$results是一个空数组以开始)

foreach($subStepsFound AS $step){

    $found = false;
    $removeEntry = false;
    $index = 0;

    foreach($results AS $key=>$result){

        if($step['step_count'] == $result['step_count']){

            $found = true;

            if($step['id'] > $result['id']){
                $removeEntry = true;
            }
        }

        if($removeEntry === true){
            $index = $key;
        }
    }

    if($removeEntry === true){
        //unset($results[$index]);
        $results[$index] = $step;
    }

    if($found === false){
        $results[] = $step;
    }
}

结果数组的预期输出:

Array(
    [0]=> Array([id]=>4, [step_count]=>1, [desc]=>"Something Newest")
)

2 个答案:

答案 0 :(得分:0)

见评论中的1.,2.,3。

foreach($subStepsFound AS $step){

    $found = false;
    $removeEntry = false;
    $index = 0;

    foreach($results AS $key=>$result){

        if($step['step_count'] == $result['step_count']){

            $found = true;

            if($step['id'] > $result['id']){
                $removeEntry = true;
            }
        }

        if($removeEntry === true){
            $results[$key] = $step; // 2. UP TO HERE
            $removeEntry = false;   // 3. RESET $removeEntry
        }
    }

    /*
    if($removeEntry === true){
      //unset($results[$index]);
      $results[$index] = $step; // 1. MOVE THIS...
    }
    */

    if($found === false){
        $results[] = $step;
    }
}

print_r($results);

在线示例:http://sandbox.onlinephpfunctions.com/code/1db78a8c08cbee9d04fe1ca47a6ea359cacdd9e9

答案 1 :(得分:0)

/*super_unique: Removes the duplicate sub-steps found*/
        function super_unique($array,$key){

            $temp_array = array();
            foreach ($array as &$v) {
                if (!isset($temp_array[$v[$key]])) $temp_array[$v[$key]] =& $v;
            }

            $array = array_values($temp_array);

            return $array;
        }

$results = super_unique($subStepsFound, 'step_count');