Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何基于一个键';合并数组中的所有重复项;s值多少?_Php_Sql_Arrays_Tsql_Php 5.6 - Fatal编程技术网

Php 如何基于一个键';合并数组中的所有重复项;s值多少?

Php 如何基于一个键';合并数组中的所有重复项;s值多少?,php,sql,arrays,tsql,php-5.6,Php,Sql,Arrays,Tsql,Php 5.6,我尝试过各种各样的解决方案,但似乎没有一种能满足我的需要——或者我不知道如何改变它们来解决我的特殊问题。基本上,我是从我的SQL server返回一堆行。查询如下所示: $params = array(&$search, &$search, &$search, &$search, &$search, &$search, &$search, &$search); $tsql = "SELECT Item.ID, Item.ItemL

我尝试过各种各样的解决方案,但似乎没有一种能满足我的需要——或者我不知道如何改变它们来解决我的特殊问题。基本上,我是从我的SQL server返回一堆行。查询如下所示:

$params = array(&$search, &$search, &$search, &$search, &$search, &$search, &$search, &$search);

$tsql = "SELECT Item.ID, Item.ItemLookupCode, nitroasl_pamtable.ManufacturerPartNumber, SupplierList.ReorderNumber, Item.Notes,
         Item.Description, Item.ExtendedDescription, Item.Quantity, nitroasl_pamtable.SpoofStock, Item.Price,
         nitroasl_pamtable.PAM_Keywords, Item.PictureName
         FROM Item
         INNER JOIN nitroasl_pamtable ON Item.ID = nitroasl_pamtable.ItemID
         INNER JOIN SupplierList ON Item.ID = SupplierList.ItemID
         WHERE (Item.ItemLookupCode LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1)
         OR (Item.ID LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1)
         OR (nitroasl_pamtable.ManufacturerPartNumber LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1)
         OR (SupplierList.ReorderNumber LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1)
         OR (Item.Notes LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1)
         OR (Item.Description LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1)
         OR (Item.ExtendedDescription LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1)
         OR (nitroasl_pamtable.PAM_Keywords LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1)";

// Allows us to determine the number of rows returned
$cursorType = array('Scrollable' => SQLSRV_CURSOR_KEYSET);

$getProducts = sqlsrv_query($conn, $tsql, $params, $cursorType);
Array (

  [results] => Array (

    [0] => Array (

      [ItemLookupCode] => TP-AC1750

      [ReorderNumber] => Array (

        [0] => ARCHERC7

        [1] => N82E16833704177

        [2] => 7681617

      )

    )

  )

)
然后,我使用以下命令将行放入数组中:

// Put results into an array
while( $row = sqlsrv_fetch_array( $getProducts, SQLSRV_FETCH_ASSOC))
{
  $results['results'][] = $row;
}
$results['results']当我搜索“tp-ac1750(删除了一些返回的列以便于查看)时,看起来是这样的:

我希望阵列看起来像这样:

$params = array(&$search, &$search, &$search, &$search, &$search, &$search, &$search, &$search);

$tsql = "SELECT Item.ID, Item.ItemLookupCode, nitroasl_pamtable.ManufacturerPartNumber, SupplierList.ReorderNumber, Item.Notes,
         Item.Description, Item.ExtendedDescription, Item.Quantity, nitroasl_pamtable.SpoofStock, Item.Price,
         nitroasl_pamtable.PAM_Keywords, Item.PictureName
         FROM Item
         INNER JOIN nitroasl_pamtable ON Item.ID = nitroasl_pamtable.ItemID
         INNER JOIN SupplierList ON Item.ID = SupplierList.ItemID
         WHERE (Item.ItemLookupCode LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1)
         OR (Item.ID LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1)
         OR (nitroasl_pamtable.ManufacturerPartNumber LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1)
         OR (SupplierList.ReorderNumber LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1)
         OR (Item.Notes LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1)
         OR (Item.Description LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1)
         OR (Item.ExtendedDescription LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1)
         OR (nitroasl_pamtable.PAM_Keywords LIKE '%' + ? + '%' AND Price > 0.00 AND WebItem = 1)";

// Allows us to determine the number of rows returned
$cursorType = array('Scrollable' => SQLSRV_CURSOR_KEYSET);

$getProducts = sqlsrv_query($conn, $tsql, $params, $cursorType);
Array (

  [results] => Array (

    [0] => Array (

      [ItemLookupCode] => TP-AC1750

      [ReorderNumber] => Array (

        [0] => ARCHERC7

        [1] => N82E16833704177

        [2] => 7681617

      )

    )

  )

)
我试过:

  • 数组_唯一
  • 数组\唯一\递归
  • 数组\u walk\u递归
  • 数组\合并\递归
  • 以及更多(各种组合)
但我似乎无法正确理解。以下是我正在尝试的:

// Remove duplicates
$results['results'] = merge_duplicates( $results['results'] );

//***********************************************
// Merge duplicate arrays and their values
//***********************************************
function merge_duplicates( $array )
{

  // Build temporary array for array_unique
  $tmp = array();
  foreach( $array as $key => $value ) {
    $tmp[ $key ] = $value;
  }

  // Find duplicates in temporary array
  $tmp = array_unique( $tmp, SORT_REGULAR );

  // Remove duplicates from original array
  foreach( $array as $key => $value ) {

    if ( !array_key_exists( $key, $tmp ) ) {

      unset( $array[ $key ] );

    }

  }

  return $array;

}
有没有办法完成这种类型的合并?有没有办法在SQL查询过程中合并这些重复项?如果有任何建议,我们将不胜感激!提前感谢:)

更新(正在使用完整阵列) 以下是我需要在其上使用此合并的实际数组(我仍然希望使用ItemLookupCode作为唯一键,但合并所有其他同级键):


我能想到的最快方法是:

<?php
$results = array(
    array('ItemLookupCode' => 'name1', 'ReorderNumber' => 1),
    array('ItemLookupCode' => 'name1', 'ReorderNumber' => 2),
    array('ItemLookupCode' => 'name1', 'ReorderNumber' => 3),
    array('ItemLookupCode' => 'name1', 'ReorderNumber' => 2),
    array('ItemLookupCode' => 'name2', 'ReorderNumber' => 1),
    array('ItemLookupCode' => 'name2', 'ReorderNumber' => 1),
);

function group($main, $item)  {
    if(!isset($main[$item['ItemLookupCode']])) {
        $main[$item['ItemLookupCode']] = array('ReorderNumber' => array());
    }
    if(!in_array($item['ReorderNumber'], $main[$item['ItemLookupCode']]['ReorderNumber'])) {
        $main[$item['ItemLookupCode']]['ReorderNumber'][] = $item['ReorderNumber'];
    }
    return $main;
}

$formatted_result = array();
foreach(array_reduce($results, "group") as $name => $item) {
    $formatted_result[] = array(
        'ItemLookupCode' => $name,
        'ReorderNumber' => $item
    );
}
print_r($formatted_result);

这并不是你真正想要的,但它可能很有用。在那篇文章中有一些可能性。我将进行实验,看看会发生什么:)这些方法有一种反复出现的主题,我不知道如何做……许多像
array\u merge\u recursive
这样的函数需要将两个数组传递给函数打开以进行比较…我需要比较多个数组(而不仅仅是两个)…您仍然
内部连接
正在调用并返回(可能)在一个结果集中,每个
项都有许多行。这不是我建议的。这个问题是在我们在另一个线程中开始讨论之前提出的:)所以这是我的初始查询…这实际上将组合结果放入名为
ReorderNumber
的父数组内名为
ReorderNumber。有趣的是,我不知道如何将子级的值向上插入父级…
数组([0]=>Array([ID]=>8265[ReorderNumber]=>Array([ReorderNumber]=>Array([0]=>N82E16833704177[1]=>7681617[2]=>ARCHERC7[3]=>ARCHERC7])
我已将ItemLookupCode更改为ID btw。我如何调整此脚本,使其不存在多个级别的
ReorderNumber