как получить позицию элемента в массиве и в цикле опустить этот элемент? - PullRequest
0 голосов
/ 19 января 2019

Я выполняю ряд математических операций в своем веб-приложении и хотел бы получить что-то вроде следующего:

Учитывая массив из N элементов, например [1,2,3], выведите на экран другой массив с тем же числом элементов, где каждая позиция - это умножение всех элементов массива, кроме позиции, которая должна быть рассчитана.

Примеры результатов:

[1,2,3] должен распечатать: [6,3,2]

[5,2,3,2,4] должен напечатать: [48,120,80, 120, 60]

Ответы [ 3 ]

0 голосов
/ 19 января 2019

Обычный цикл for дает вам доступ к текущему индексу. В каждой итерации цикла вы можете использовать array_slice, чтобы сделать копию, и array_splice, чтобы удалить один элемент. Затем array_reduce с подходящим обратным вызовом для умножения оставшихся значений.

function reduce_to_products_without_value_at_index( $initial_array ) {
  $num_elements = count( $initial_array );
  $product_array = [];

  for ( $index = 0; $index < $num_elements; $index++ ) {
    $array_copy = array_slice( $initial_array, 0 );
    array_splice( $array_copy, $index, 1 );
    $product = array_reduce( $array_copy, function( $carry, $item ) {
      return $carry * $item;
    }, 1 );
    $product_array[$index] = $product;
  }

  print_r( $product_array );
}

reduce_to_products_without_value_at_index( [1,2,3] );
reduce_to_products_without_value_at_index( [5,2,3,2,4] );
0 голосов
/ 19 января 2019

Никаких специальных манипуляций с массивами (нарезка / сплайсинг), просто супер простая математика.

Код: ( Демо )

$array = [5,2,3,2,4];

foreach ($array as $val) {
    $result[] = array_product($array) / $val;
}

var_export($result);

Вывод:

array (
  0 => 48,
  1 => 120,
  2 => 80,
  3 => 120,
  4 => 60,
)

Вы можете кэшировать array_product($array) перед циклом для большей эффективности. Демонстрация По сути, это та же логика, что и в ответе Ника. Мне просто легче читать с использованием языковой конструкции и функционального программирования.

0 голосов
/ 19 января 2019

Вы можете использовать array_product(), чтобы получить произведение всех значений в вашем массиве, а затем использовать array_map(), чтобы разделить на каждое значение, данное для «удаления» этого значения из всего продукта.

$arr =  [1, 2, 3];

$product = array_product($arr);
$res = array_map(function ($v) use ($product) {
  return $product == 0 ? 0 : $product/$v;
}, $arr);

print_r($res);

Выход:

Array ( [0] => 6 [1] => 3 [2] => 2 )

Другие случаи:

[5, 2, 3, 2, 4] дает [48, 120, 80, 120, 60]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...