Как создать многомерный массив из индексированного массива в PHP? - PullRequest
0 голосов
/ 05 февраля 2019
  • У меня есть двумерный массив, в котором его первое измерение является индексным массивом, а второе - ассоциативным массивом.
  • В массиве есть несколько полей-дубликатов, которые я хочу объединить,а для других не дублированных полей я хочу создать массив третьего измерения и вставить их туда.

Это мой код и массив:

Весь код работает правильнопросто поле "datacontractor", которое является моим третьим измерением, не работает должным образом.

        <?php
    $array=Array
    (
        "0" => Array
        (
                "sid" => 10,
                "contractorid" => 1,
                "fname" => "hi",
                "lname" => "fam",
                "sname" => "saba",
                "materialname" => "beton",
                "netweight" => 100,
            ),
        "1" => Array
        (
                "sid" => 16,
                "contractorid" => 2,
                "fname" => "a",
                "lname" => "a",
                "sname" => "khoram",
                "materialname" => "kk",
                "netweight" => 200,
            ),
        "2" => Array
        (
                "sid" => 16,
                "contractorid" => 7,
                "fname" => "a",
                "lname" => "a",
                "sname" => "khoram",
                "materialname" => "kk",
                "netweight" => 777,
            ),
        "3" => Array
        (
            "sid" => 10,
            "contractorid" => 5,
            "fname" => "hi",
            "lname" => "fam",
            "sname" => "saba",
            "materialname" => "beton",
            "netweight" => 200,
        ),
        "4" => Array
        (
            "sid" => 10,
            "contractorid" => 8,
            "fname" => "hi",
            "lname" => "fam",
            "sname" => "saba",
            "materialname" => "beton",
            "netweight" => 600,
        ),
        "5" => Array
        (
            "sid" => 15,
            "contractorid" => 9,
            "fname" => "hi",
            "lname" => "fam",
            "sname" => "saba",
            "materialname" => "beton",
            "netweight" => 400,
        ),

    );

    $finalarray[]= array();
    $sidlist= array();
    $arraycount=count($array);
    for($i=0;$i<$arraycount ;$i++) {
        array_push($sidlist,$array[$i]["sid"]);
    }
    $sidlist = array_unique($sidlist);
    $sidlistcount=count($sidlist);
    $sidlist1=array();
    foreach ($sidlist as $m){
        array_push($sidlist1,$m);
    }


    for ($i = 0;$i<$sidlistcount ; $i++){
        $id=$sidlist1[$i];
        $datacontractor[$id]= array();
        for ($j = 0;$j<$arraycount ; $j++){
            if ($id==$array[$j]["sid"]){
                $contractorid = $array[$j]["contractorid"];
                $netweight = $array[$j]["netweight"];
                $finalarray[$i]=array(
                    "sid" => $id,
                    "fname" => $array[$j]["fname"],
                    "lname" => $array[$j]["lname"],
                    "sname" => $array[$j]["sname"],
                    "materialname" => $array[$j]["materialname"],
                    "datacontractor" => $datacontractor[$id],

                );


                $datacontractor[$id]["$contractorid"]=$netweight;
                echo $id,"<br>";
            }

        }
    }

    echo '<pre>';
    print_r($finalarray);
    echo '<pre>';


Это мой вывод этого кода:

но он имеет неправильный ответв поле «datacontractor».

Array ([0] => Array
    (
        [sid] => 10
        [fname] => hi
        [lname] => fam
        [sname] => saba
        [materialname] => beton
        [datacontractor] => Array
            (
                [1] => 100
                [5] => 200

            )

    )[1] => Array
    (
        [sid] => 16
        [fname] => a
        [lname] => a
        [sname] => khoram
        [materialname] => kk
        [datacontractor] => Array
            (
                [2] => 200


            )

    )[2] => Array
    (
        [sid] => 15
        [fname] => hi
        [lname] => fam
        [sname] => saba
        [materialname] => beton
        [datacontractor] => Array
            (

            )

    ))

И, наконец, мой желаемый вывод:

Пожалуйста, проверьте и скажите мне, в чем моя ошибка.

Array ([0] => Array
    (
        [sid] => 10
        [fname] => hi
        [lname] => fam
        [sname] => saba
        [materialname] => beton
        [datacontractor] => Array
            (
                [1] => 100
                [5] => 200
                [8] => 600 
            )

    )[1] => Array
    (
        [sid] => 16
        [fname] => a
        [lname] => a
        [sname] => khoram
        [materialname] => kk
        [datacontractor] => Array
            (
                [2] => 200
                [7] => 777

            )

    )[2] => Array
    (
        [sid] => 15
        [fname] => hi
        [lname] => fam
        [sname] => saba
        [materialname] => beton
        [datacontractor] => Array
            (

                [9] => 400
            )

    ))

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Вы можете использовать array_reduce

<code>$data = array_reduce($array, function ($old, $new) {
    if (isset($old[$new['sid']])) {
        $new['datacontractor'] = array_merge($old[$new['sid']]['datacontractor'], [$new['netweight']]);
        $old[$new['sid']] = $new;
    } else {
        $new['datacontractor'] = [$new['netweight']];
    }
    unset($new['netweight']);
    $old[$new['sid']] = $new;
    return $old;
}, []);

$data = array_values($data);
print '<pre>';
print_r($data);
print '
';
0 голосов
/ 05 февраля 2019

Вы устанавливаете "datacontractor" => $datacontractor[$id] на finalarray, прежде чем закончить вставку всех данных в $datacontractor[$id] -> сделать это в отдельном цикле.

Ваш код гораздо сложнее, чем вам действительно нужно.

Рассмотрим следующую короткую версию:

$array = []; // this is just some of the fields - you can add all of then here 
$array[] = array("id"=> 10, "contractorid" => 1,"netweight" => 100);
$array[] = array("id"=> 16, "contractorid" => 2,"netweight" => 200);
$array[] = array("id"=> 16, "contractorid" => 7,"netweight" => 777);
$array[] = array("id"=> 10, "contractorid" => 5,"netweight" => 200);
$array[] = array("id"=> 10, "contractorid" => 8,"netweight" => 600);
$array[] = array("id"=> 15, "contractorid" => 9,"netweight" => 400);

$ans = [];
foreach($array as $e) {
    if (!isset($ans[$e['id']])) { // if never set do first time
        $ans[$e['id']] = array("sid" => $e['id'], "datacontractor" => array($e["contractorid"] => $e["netweight"])); // here you can add all your other fields as fname, lname...
    } else {
        $ans[$e['id']]["datacontractor"][$e["contractorid"]] = $e["netweight"]; // just add the new field as already set
    }
}

Теперь $ans выведет ваше желание

Редактировать :

Для значения multi contractorid измените его на:

foreach($array as $e) {
    if (!isset($ans[$e['id']])) { // if never set do first time
        $ans[$e['id']] = array("sid" => $e['id'], "datacontractor" => array($e["contractorid"] => [$e["netweight"]])); // notice "contractorid" has array inside (extra "[]" around $e["netweight"])
    } else {
        $ans[$e['id']]["datacontractor"][$e["contractorid"]][] = $e["netweight"]; // append to the contractorid array
    }
}

Для переиндексации $ans сделайте это в конце: $ans = array_values($ans);

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