根据id重新排列php个多维数组

rearrange php multidimensional array according to id

-我不知道如何根据 ids 重新组合这个数组。


$orginal_arr = 

Array
(
    [0] => Array
        (
            [id] => 17
            [content] => string...?
        )

    [1] => Array
        (
            [id] => 20
            [content] => hello
        )

    [2] => Array
        (
            [id] => 20
            [content] => string...?
        )

    [3] => Array
        (
            [id] => 20
            [content] => string...string...??
        )

    [4] => Array
        (
            [id] => 17
            [content] => string...
        )

    [5] => Array
        (
            [id] => 17
            [content] => string...
        )

);

我想将上面的$orginal_arr数组转换成下面的$desired_arr数组。

$desired_arr = Array (

          [0] => Array
              (
                  [17] => Array
                      (
                          [0] => string...?
                      )
              )
          [1] => Array
              (
                  [20] => Array
                      (
                          [0] => hello
                          [1] => string...?
                          [2] => string... string...??
                      )
              )
          [2] => Array
              (
                  [17] => Array
                      (
                          [0] => string...
                          [1] => string...
                      )
              )

      );

到目前为止,我正在尝试以下方法:

function group_by_key($key, $data)
{
    $result = array();
    $j      = 0;
    foreach ($data as $val) {
        if (array_key_exists($key, $val)) {
            $result[$val[$key]][$j] = $val;
        } else {
            $result[""][] = $val;
        }
        $j++;
    }
    return $result;
}


$desired_arr = group_by_key("id", $orginal_arr);

$desired_arr2 = array();
foreach ($desired_arr as $index => $item) {
    $desired_arr2 += $item;
}


echo "<pre>";
print_r($desired_arr2);
echo "</pre>";

输出:

Array
(
    [0] => Array
        (
            [id] => 17
            [content] => string...?
        )

    [4] => Array
        (
            [id] => 17
            [content] => string...
        )

    [5] => Array
        (
            [id] => 17
            [content] => string...
        )

    [1] => Array
        (
            [id] => 20
            [content] => hello
        )

    [2] => Array
        (
            [id] => 20
            [content] => string...?
        )

    [3] => Array
        (
            [id] => 20
            [content] => string...string...??
        )

)

- 非常感谢。

正如我在评论中所说,我不再熟悉 PHP 语法,所以这将是伪代码。

我会分两步完成, 首先我想要这个结果

$temp_arr = 

Array
(
    [0] => Array
        (
            [id] => 17
            [contents] => Array(
                [0] => string...? 
            )
        )

    [1] => Array
        (
            [id] => 20
            [contents] => Array(
                [0] => hello
                [1] => string...? 
                [2] => string...string...??
            )
        )
...
...
);

看,我保留了带有 id 和内容(最后一个 S)的 Object 结构。 然后检查 id 会更容易,因为它可以直接访问

$temp_array = Array();

foreach ($original_array as $element) {
    $last = end($temp_array);
    if ($last && $element->id == $last->id) {
        // add to the last $temp_array element
        $temp_array[count($temp_array)-1]->contents[] = $element->content;
    }
    else {
        // create a new $temp_array element
        $temp_array[] = Array(
            "id" => $element->id,
            "contents => Array(
                $element->content
            )
        );
        
    }
}

对于第二步,您只需要迭代 $temp_array 并根据需要设置格式

这里是这个问题的另一个解决方案。

$desired_arr = array();
$prev_id        = '';
$prev_key       = null;
foreach ($orginal_arr as $key => $value) {
    $this_id = $value['id'];
    if ($this_id == $prev_id) {
        array_push($desired_arr[$prev_key][$value['id']], $value['content']);
    } else {
        $desired_arr[$key][$value['id']] = (array)$value['content'];
        $prev_key                           = $key;
    }
    $prev_id = $this_id;
}
$desired_arr = array_values($desired_arr);