Многомерные массивы - учу PHP

#1 1 ноября 2019 в 16:41
Вопросы есть по многомерным массивам, как правильно находить элементы в массивах и производить с ними действия, например вот что у меня получилось решая задачку из учебника. Первая задача была написать генератор многомерного массива МхМ — получилось. Вторая транспонировать полученный массив.

  1.  
  2. <?php
  3. // генератор массива MxM заполненный случайным образом числами от 0 до 9
  4.  
  5. $count = 5; //Количество строк и столбцов
  6. $min = 0;
  7. $max = 9;
  8.  
  9. //Функция получения рандомной матрицы
  10.  
  11. function getRandomNumbers($min, $max, $count)
  12. {
  13. $array=array();
  14. for($i=0;$i<$count;++$i){
  15. for($j=0;$j<$count;++$j){
  16. $array[$i][$j]=rand($min,$max);
  17. }
  18. }
  19. return $array;
  20. }
  21.  
  22. //Преобразуем матрицу к необходимому диапазону чисел
  23. $matrix = getRandomNumbers($min, $max, $count);
  24. //Смотрю полученный массив
  25. print_r ($matrix);
  26.  
  27. //Выводим исходный полученный массив в табличный вид
  28. echo '<table border="1" cellpadding="5">';
  29. for ($row = 0; $row < count($matrix); $row++){
  30. echo '<tr>';
  31. foreach($matrix[$row] as $value) {
  32. echo '<td>'.$value.'</td>';
  33. }
  34. echo '</tr>';
  35. }
  36. echo '</table>';
  37. /*
  38. Задание:
  39. Сформировать новый массив по правилам:
  40. 1) Если в строке встречаются одинаковые числа, то они заменяются на результат произведения этого числа на количество повторений.
  41. 2) Если в столбце встречаются одинаковые числа, то они заменяются на результат произведения этого числа на количество повторений.
  42. 3) Если число встречается и в строке, и в столбце, то оно заменяется на сумму произведения этого числа на количество повторений в строке и произведения этого числа на количество повторений в столбце.
  43. 4) Если число встречает в строке и столбце один раз, то оно переносится без изменений.
  44. */
  45. // Транспонируем матрицу и выводим матрицу по заданию
  46. foreach ($matrix as $row => $arr) {
  47. foreach ($arr as $key => $value){
  48. // И вот тут я затупил как перебрать многомерный массив и применить условия.
  49.  
  50. }
  51.  
  52. }
  53.  
  54.  
  55.  
  56. ?>
  57.  
Для обучающих, на сайтах php.net круто все расписано, но все приходится понимать через шишки, а вот интересная картинка которая откидывает некоторые шишки сразу — визуализация это сила в обучении:
Иллюстрация
#2 1 ноября 2019 в 16:44
Решение не нужно — это учеба, хочу сделать сам, нужно ссылки на почитать, где описано нормально про многомерные или подсказки — но не решение.
#4 1 ноября 2019 в 18:38
Ris, Спасибо друг, я это смотрел — и применил этот способ при выводе рандомного массива, а вот как теперь отобрать нужный элемент и преобразовать не втыкаю… Условия я изучил, а вот как применять условия в многомерных массивах с выборкой по строке и столбцу, пока загадка для меня.
#5 1 ноября 2019 в 18:50

а вот как теперь отобрать нужный элемент и преобразовать не втыкаю.

jorgovich
Отобрать нужный элемент по значению или по ключу?
Всякие array_column и array_search можно попробовать.
www.php.net/manual/ru/ref.array.php
#6 1 ноября 2019 в 19:01
В задаче по значению, получается функция точно по столбцу, но на счет search пока не уверен, я понял что она ищет по первому элементу — но пока не могу представить как оно происходит, если это многомерный массив — это меня путает..
Возможно не поразмыслил, над твоей подсказкой… Еще намекни почему search? если уверен — что нужна в этом действии, я пока сильно туплю ))).
#7 1 ноября 2019 в 19:42
jorgovich,
Я запустил ваш код и получил некую таблицу:
<table border="1" cellpadding="5"><tr><td>4</td><td>4</td><td>8</td><td>1</td><td>8</td></tr><tr><td>4</td><td>9</td><td>7</td><td>9</td><td>8</td></tr><tr><td>0</td><td>8</td><td>1</td><td>7</td><td>3</td></tr><tr><td>2</td><td>8</td><td>2</td><td>0</td><td>3</td></tr><tr><td>6</td><td>1</td><td>7</td><td>3</td><td>8</td></tr></table>
Мне интересно, что предполагается получить в результате?
#8 1 ноября 2019 в 19:48
Ris, Там в комментах все условия задания…
#9 1 ноября 2019 в 19:50
jorgovich,
Почитал.
Есть такая штука, как array_count_values
Так вот if(array_count_values($value) > 1){$value = $value * array_count_values($value);}… ну и так далее… ну и так далее
#10 1 ноября 2019 в 19:57
Спасибо, мельком глянул — то что нужно! Я обязательно посмотрю, у меня таймаут, время баеньки, завтра разберусь — Ris, — мое почтение и уважение! БОЛЬШОЕ СПАСИБО!
#11 1 ноября 2019 в 20:07
jorgovich,
Пожалуйста.
И я вовсе не специалист по массивам. Просто задал в яндексе "найти совпадения в массиве php".
#12 7 ноября 2019 в 11:19
Почти решил, что означает ошибка:
Warning: array_count_values() expects exactly 1 parameter, 2 given
#13 7 ноября 2019 в 11:25

expects exactly 1 parameter, 2 given

jorgovich
Ожидался один параметр, а прилетело два. У вас должно быть array_count_values($param), а в реальности так array_count_values($param1, $param2)
#14 7 ноября 2019 в 11:38
Loadырь, понял попробую по другому.
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.