Формирование нового массива

Diana95

Новичок
Доброго вам времени суток, только начала изучать PHP, но вот уже на второй задаче проблемы, очень прошу помочь:
Необходимо переоформить выполнение формирования нового массива в виде функции, где входными данными будут имя и id(как мне объяснили это буду переменные), а на выходе будет сгруппированный массив.
Вот код без функции:
<?
$array1 = array(
0=>array("name"=>"Ivan", 'id'=>1),
1=>array("name"=>"Ivan", 'id'=>2),
2=>array("name"=>"Sergei", 'id'=>3),
3=>array("name"=>"Ivan", 'id'=>2)
);

$array2 = array();
foreach($array1 as $element){
$array2[ $element['name'] ] [ ] = $element;
}

echo '<pre>';
var_dump($array2);

Очень прошу помочь, потому что пока разобраться не могу. Заранее спасибо!

P.S. Для справки изначально условие стояло следующее:
Данные из многомерного массива вида:
$array1 = array(
0=>array("name"=>"Ivan", 'id'=>1),
1=>array("name"=>"Ivan", 'id'=>2),
2=>array("name"=>"Sergei", 'id'=>3),
3=>array("name"=>"Ivan", 'id'=>2)
);
Необходимо передать в пока ещё пустой массив и заполнить данными из $array1 в виде:
$array2=array(
"Ivan"=>array(
1=>array(0=>array("name"=>"Ivan", 'id'=>1)
2=>array(0=>array("name"=>"Ivan", 'id'=>2
1=>array("name"=>"Ivan", 'id'=>2))
"Sergei"=>array(
3=>array(0=>array("name"=>"Sergei", 'id'=>3)
)
Естественно данных не только 4 (это просто для примера), но поля именно такие
 

vasinsky

Новичок
Diana95, а так ?

PHP:
/**
* @param string - искомое имя
* @param int - нужный идентификатор
* @param array - массив с данными, который нужно обработать
* @return mixed array/bool
*
*/
function resort($name, $id, $array){
  foreach($array as $el){
    if($el['name'] == $name && $el['id'] == $id)
        $res[$el[name]][] = $el; 
  }
 
  return isset($res) ? $res : false;
}
 

Diana95

Новичок
Diana95, а так ?

PHP:
/**
* @param string - искомое имя
* @param int - нужный идентификатор
* @param array - массив с данными, который нужно обработать
* @return mixed array/bool
*
*/
function resort($name, $id, $array){
  foreach($array as $el){
    if($el['name'] == $name && $el['id'] == $id)
        $res[$el[name]][] = $el;
  }

  return isset($res) ? $res : false;
}
Я так понимаю $res это новый массив? Просто вот у меня не выходит вывод.

PHP:
<?php
/**
* @param string - искомое имя
* @param int - нужный идентификатор
* @param array - массив с данными, который нужно обработать
* @return mixed array/bool
*
*/
function resort($name, $id, $array){
$res = array();
  foreach($array as $el){
    if($el['name'] == $name && $el['id'] == $id)
        $res[$el[name]][] = $el;
  }
  return isset($res) ? $res : false;
}
$array= array(
            0=>array("name"=>"Ivan", 'id'=>1),
            1=>array("name"=>"Ivan", 'id'=>2),
            2=>array("name"=>"Sergei", 'id'=>3),
            3=>array("name"=>"Ivan", 'id'=>4));

$res=resort($name, $id, $array);  
      
echo '<pre>';
print_r($res);
?>
P.S. Извините может жёстко глуплю, просто в PHP пока вообще не разбираюсь.
 

Diana95

Новичок
Всё мне наконец объяснили, функция должна передавать 2 значения массив array и поле по которому я буду группировать новый массив.
.
 

vasinsky

Новичок
Всё мне наконец объяснили, функция должна передавать 2 значения массив array и поле по которому я буду группировать новый массив.
я заметил что в первом посте - ты по сам массив - ничего не сказал, только про 2 аргумента
но внутри функции без финтелей - которые никому не нужны - с исходным массивом не поработать - его тупо не будет в той локальной области.

массив array и поле
поле?? ключ массива ? т.е. name или id
или значение элемента массива?

Я так понимаю $res это новый массив? Просто вот у меня не выходит вывод.
PHP:
function resort($name, $id, $array){
     //$res = array(); // косякнул я
      foreach($array as $el){
        if($el['name'] == $name && $el['id'] == $id)
            $res[$el['name']][] = $el;
      }
      return isset($res) ? $res : false;
}
$array= array(
            0=>array("name"=>"Ivan", 'id'=>1),
            1=>array("name"=>"Ivan", 'id'=>2),
            2=>array("name"=>"Sergei", 'id'=>3),
            3=>array("name"=>"Ivan", 'id'=>4));

$res=resort('Ivan', 1, $array); 
   
echo '<pre>' . print_r($res,1) . '</pre>';
Код:
Array
(
    [Ivan] => Array
        (
            [0] => Array
                (
                    [name] => Ivan
                    [id] => 1
                )

        )

)

но тебе по видимому сейчас нужно уже

PHP:
function resort($array, $name){
      foreach($array as $el){
        if($el['name'] == $name)
            $res[$el['name']][] = $el;
      }
      return isset($res) ? $res : false;
}
$array= array(
            0=>array("name"=>"Ivan", 'id'=>1),
            1=>array("name"=>"Ivan", 'id'=>2),
            2=>array("name"=>"Sergei", 'id'=>3),
            3=>array("name"=>"Ivan", 'id'=>4));

$res=resort($array, 'Ivan'); 
     
echo '<pre>' . print_r($res,1) . '</pre>';
Код:
Array
(
    [Ivan] => Array
        (
            [0] => Array
                (
                    [name] => Ivan
                    [id] => 1
                )

            [1] => Array
                (
                    [name] => Ivan
                    [id] => 2
                )

            [2] => Array
                (
                    [name] => Ivan
                    [id] => 4
                )

        )

)
 

vasinsky

Новичок
не за что - больше практикуйте, в принципе вы сами решили задачу - я просто обернул её в функцию.
 

Diana95

Новичок
не за что - больше практикуйте, в принципе вы сами решили задачу - я просто обернул её в функцию.
Теперь у меня новая задача, я должна группировать по конкретному полю, т.е. если указан id когда вызываю, то группирую по id, а если по name, то по name и выдавать все значения.
Например, $res=resort($array, 'id'); и обращаться к функции которая сгруппирует их id, а у меня уже функция под name заточена, т.е. как вы и говорили по ключу, как это сделать мой необразованный мозг пока не знает. Простите за то что пристаю всё.
 

vasinsky

Новичок
просто к слову - группировка по id ) - он на то и id - что должен быть уникален, ну да лан.
я бы сделал так
PHP:
function resort($array, $key){

      foreach($array as $el){
        if($el[$key] == $el[$key]) //выглядит туфталогией, но всё же
            $res[$el[$key]][] = $el;
      }

      return isset($res) ? $res : false;
}

$res=resort($array, 'id');
 

Diana95

Новичок
просто к слову - группировка по id ) - он на то и id - что должен быть уникален, ну да лан.
я бы сделал так
PHP:
function resort($array, $key){

      foreach($array as $el){
        if($el[$key] == $el[$key]) //выглядит туфталогией, но всё же
            $res[$el[$key]][] = $el;
      }

      return isset($res) ? $res : false;
}

$res=resort($array, 'id');
Ещё раз выручили, спасибо за помощь!
 

vasinsky

Новичок
ну вы поняли что происходит внутри функции последних 2х примеров?
 

vasinsky

Новичок
чёт странное задание)
группировать по name, а внутри по id
группировать по id, а внутри по name

чёт аллогичное - т.е. если даже взять в учёт что id не уникален - то пара name=>id должна быть уникальна
отсюда - если сгруппировать по имени - то внутри все id разные и наоборот - если сгруппировать по name - то внутри все id будут уникальные

или я не так понял
 

vasinsky

Новичок
лан, может я чёт не правильно понял)
но с моим комментом - не важно скока данных)
 

Diana95

Новичок
Блин вообще не получается по нескольким полям, один бред выводит......
 

vasinsky

Новичок
а что должно получиться? какой массив на выходе? я просто не понял сути. и что пробуете? как?
 

Diana95

Новичок
Ну вот например такой массив
$array= array(
0=>array("name"=>"Ivan", 'id'=>5),
1=>array("name"=>"Ivan", 'id'=>2),
2=>array("name"=>"Sergei", 'id'=>3),
3=>array("name"=>"Ivan", 'id'=>4));
Я задаю группировку и вот сейчас вот так у меня получается:
Array
(
[Ivan] => Array
(
[0] => Array
(
[name] => Ivan
[id] => 5
)

[1] => Array
(
[name] => Ivan
[id] => 2
)

[2] => Array
(
[name] => Ivan
[id] => 4
)

)

[Sergei] => Array
(
[0] => Array
(
[name] => Sergei
[id] => 3
)

)

)
А надо чтобы
Array
(
[Ivan] => Array
(
[0] => Array
(
[name] => Ivan
[id] => 2
)

[1] => Array
(
[name] => Ivan
[id] => 4
)

[2] => Array
(
[name] => Ivan
[id] => 5
)

)

[Sergei] => Array
(
[0] => Array
(
[name] => Sergei
[id] => 3
)

)
Если что выделил изменения тэгами жирное выделение.

И по аналогии если с id правда у меня всего 2 имя но всё равно
 

vasinsky

Новичок
группировка и сортировка внутри группы
или
двойная группировка?
 
Сверху