@Emmet1

Как сформировать приоритет в php массиве?

Есть массив с адресами картинок Для галереи товара.
Нужно сделать так, чтобы при выводе картинок через foreach, картинки выводились в определенном порядке.
Сначала та, которая содержит в названии "lux", потом та которая prod_3, prod_5 и в конце GOLD.
Это реально сделать?

array(1) {
  [0]=>
  array(1) {
    ["small"]=>
    string(58) "/images/0001_GOLD.jpg"
  }
  [1]=>
  array(1) {
    ["small"]=>
    string(65) "/images/002_prod_3.jpg"
  }
  [2]=>
  array(1) {
    ["small"]=>
    string(65) "/images/002_prod_5.jpg"
  }
  [3]=>
  array(1) {
    ["small"]=>
    string(65) "/images/002_lux.jpg"
  }
  • Вопрос задан
  • 154 просмотра
Решения вопроса 1
vilinyh
@vilinyh
- usort — Сортирует массив по значениям используя пользовательскую функцию для сравнения элементов
https://www.php.net/manual/ru/function.usort.php
- uasort — Сортирует массив, используя пользовательскую функцию для сравнения элементов с сохранением ключей
https://www.php.net/manual/ru/function.uasort.php

Пример:
$presidents = [
    'George Washington',
    'James Madison',
    'Thomas Jefferson',
    'George Washington',
    'Thomas Jefferson',
    'John Adams',
];

$fnSortPresidents = function ($a, $b) {
    $defaultOrder = 5;
    $presidentsOrder = [
        'George Washington' => 1,
        'John Adams' => 2,
        'Thomas Jefferson' => 3,
        'James Madison' => 4,
    ];

    $orderA = $presidentsOrder[$a] ?? $defaultOrder;
    $orderB = $presidentsOrder[$b] ?? $defaultOrder;

    return $orderA < $orderB ? -1 : 1;
};

uasort($presidents, $fnSortPresidents);

var_dump($presidents);

// array (size=6)
//   3 => string 'George Washington' (length=17)
//   0 => string 'George Washington' (length=17)
//   5 => string 'John Adams' (length=10)
//   4 => string 'Thomas Jefferson' (length=16)
//   2 => string 'Thomas Jefferson' (length=16)
//   1 => string 'James Madison' (length=13)


Вместо функции $fnSortPresidents определяете свой способ сравнения элементов и получаете сортировку своего массива.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@dzhebrak
Кроме usort/uasort можно разбить ссылки на отдельные массивы, а затем собрать обратно в один, который и перебрать с помощью foreach:

$arr = [
	["small"=> "/images/0001_GOLD.jpg"],
  	["small"=> "/images/003_lux.jpg"],
  	["small"=> "/images/002_prod_3.jpg"],
  	["small"=> "/images/0002_GOLD.jpg"],
  	["small"=> "/images/002_prod_5.jpg"],
  	["small"=> "/images/002_lux.jpg"],
  	["small"=> "/images/002_prod_4.jpg"],
];

$lux = [];
$prod = [];
$gold = [];

foreach ($arr as $v) {
	if(strpos($v['small'], 'lux') !== false) {
		$lux[] = $v;
	}

	if(strpos($v['small'], 'prod_') !== false) {
		$prod[] = $v;
	}

	if(strpos($v['small'], 'GOLD') !== false) {
		$gold[] = $v;
	}
}

print_r(array_merge($lux, $prod, $gold));
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы