PHP - ищет способ сравнить значение в двумерном массиве, а затем объединить массивы с одинаковым значением, чтобы сформировать трехмерный массив - PullRequest
0 голосов
/ 29 октября 2018

ищу способ добиться результата из вышеприведенного заголовка. У меня есть двумерный массив, как это

Array
(
    [0] => Array
        (
            [reference_no] => A0012
            [code] => HSWH30
            [net_unit_price] => 24000
            [quantity] => 2
        )

    [1] => Array
        (
            [reference_no] => A0012
            [code] => HSWH15
            [net_unit_price] => 21000
            [quantity] => 2
        )

    [2] => Array
        (
            [reference_no] => A0013
            [code] => HS-106AR
            [net_unit_price] => 2400
            [quantity] => 1
        )

    [3] => Array
        (
            [reference_no] => A0013
            [code] => HS-8012
            [net_unit_price] => 4500
            [quantity] => 2
        )
)

И я ищу способ сравнить массивы, используя значение [reference_no], затем добавить массивы с тем же [reference_no] в массив, тем самым формируя трехмерный массив, как показано ниже

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [reference_no] => A0012
                    [code] => HSWH30
                    [net_unit_price] => 24000
                    [quantity] => 2
                )

            [1] => Array
                (
                    [reference_no] => A0012
                    [code] => HSWH15
                    [net_unit_price] => 21000
                    [quantity] => 2
                )
        )

    [1] => Array
        (
            [0] => Array
                (
                    [reference_no] => A0013
                    [code] => HS-106AR
                    [net_unit_price] => 2400
                    [quantity] => 1
                )

            [1] => Array
                (

                    [reference_no] => A0013
                    [code] => HS-8012
                    [net_unit_price] => 4500
                    [quantity] => 2
                )       
        )
)

Пожалуйста, мне нужна быстрая помощь, я пытался использовать for loop и array_push для сравнения и объединения / объединения аналогичного массива, но не получаю нужного мне результата.

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Я бы создал новый ассоциативный массив и использовал reference_no в качестве ключей. Тогда гораздо проще проверить, существует ли ключ в новом массиве.

$sorted = [];

foreach($array as $el) {
  $ref = $el[reference_no];
  if (array_key_exists($ref, $sorted)) {
    $sorted[$ref][] = $el;
  } else {
    $sorted[$ref] = [$el];
  }
}

Если вам нужно преобразовать $ sorted, чтобы иметь последовательный числовой индекс (0,1,2,3 ...), вы можете сделать это как последний шаг с array_map или другим циклом foreach.

0 голосов
/ 29 октября 2018

Все, что вам нужно сделать, это зациклить массив и создать новый ассоциативный массив с ключом ref no.
Это сгруппирует элементы по вашему желанию, и когда цикл будет завершен, вы сбрасываете индекс массива со значениями массива.

foreach($arr as $sub){
    $new[$sub['reference_no']][] = $sub;
}
$new = array_values($new);
var_dump($new);

Выход:

array(2) {
  [0]=>
  array(2) {
    [0]=>
    array(4) {
      ["reference_no"]=>
      string(5) "A0012"
      ["code"]=>
      string(6) "HSWH30"
      ["net_unit_price"]=>
      string(5) "24000"
      ["quantity"]=>
      string(1) "2"
    }
    [1]=>
    array(4) {
      ["reference_no"]=>
      string(5) "A0012"
      ["code"]=>
      string(6) "HSWH15"
      ["net_unit_price"]=>
      string(5) "21000"
      ["quantity"]=>
      string(1) "2"
    }
  }
  [1]=>
  array(2) {
    [0]=>
    array(4) {
      ["reference_no"]=>
      string(5) "A0013"
      ["code"]=>
      string(8) "HS-106AR"
      ["net_unit_price"]=>
      string(4) "2400"
      ["quantity"]=>
      string(1) "1"
    }
    [1]=>
    array(4) {
      ["reference_no"]=>
      string(5) "A0013"
      ["code"]=>
      string(7) "HS-8012"
      ["net_unit_price"]=>
      string(4) "4500"
      ["quantity"]=>
      string(1) "2"
    }
  }
}

https://3v4l.org/DQEmC

0 голосов
/ 29 октября 2018

Почему бы не попробовать, скажем:

 $arrayExample[0] => Array
                ( [reference_no] => A0013
                        [code] => HS-8012
                         [net_unit_price] => 4500
                         [quantity] => 2 )

так технически говоря значение $arrayExample[0]["reference_no"] is A0013 если так, то почему бы не использовать

if( strpos($arrayExample[0]["reference_no"],"A0013") !==false)
{
    $arrayExample[0]["reference_no"] = array( 
[0] = //something
[1] = //something1
...
)}

Надеюсь, это поможет

...