переставить многомерный массив php в соответствии с идентификатором

#arrays #sorting #nested #key

#массивы #сортировка #вложенный #Клавиша

Вопрос:

-Я не могу понять, как перегруппировать этот массив в соответствии с идентификаторами.

  • Этот массив берется из таблицы mysql. числа 17 и 20 являются внешними ключами в таблице.
 
$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...??
        )

)
  

— Большое вам спасибо.

Комментарии:

1. Вы что-нибудь пробовали?

2. спасибо за комментарий. Да, у меня есть… Я все еще пытаюсь, но пока безуспешно.

3. Хорошо, итак, опубликуйте, что вы сделали до сих пор, и каковы результаты, чтобы мы могли попытаться понять, что не так в вашем коде.

4. @jeremycastelli хорошо… Я отредактировал свой первоначальный вопрос и опубликовал небольшой код … но, очевидно, это не решение.

5. Надеюсь, здесь не было недопонимания, очевидно, что ваше решение не работает, иначе вы бы не обращались за помощью. Многие люди отправляют запросы на SO в поисках бесплатного способа получения фрагмента кода. Никто не хочет помогать таким людям . Поэтому, когда вы публикуете то, что вы пробовали, вы показываете, что вы не из таких.

Ответ №1:

Как я уже сказал в своем комментарии, я больше не знаком с синтаксисом PHP, поэтому это будет псевдокод.

Я бы сделал это в 2 шага, сначала я хочу этот результат

 $temp_arr = 

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

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

Видите ли, я сохранил структуру объекта с идентификатором и содержимым (с конечным S).
тогда будет легче проверить идентификатор, поскольку он доступен напрямую

 $temp_array = Array();

foreach ($original_array as $element) {
    $last = end($temp_array);
    if ($last amp;amp; $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 и форматировать, как вам нравится

Ответ №2:

вот еще одно решение этой проблемы.

 $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);