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