比较数组并计算它们的值

时间:2017-04-12 22:10:49

标签: php arrays

我如何比较这些数组并计算它们的值:

$arrayone = array("3", "2", "1", "2", "3");
$arraytwo = array("1", "2", "3", "2", "1");

我的目标不是3(唯一值)或5(一般值相同)但是4! 第二个数组包含一个1太多,我怎么能得到这样的新数组:

$arraythree = array("1", "2", "3", "2");

这给了我3个独特的价值观:

$intersect = array_intersect($arrayone, $arraytwo);
$arraythree = array_unique($intersect);
count($arraythree)

这给了我5个非唯一值:

$arraythree = array_intersect($arrayone, $arraytwo);
count($arraythree)

1 个答案:

答案 0 :(得分:1)

您可以使用此自定义功能:

    private void btnUpload_Click(object sender, EventArgs e)
     {
DataTable dt = new DataTable();
string strSelect = "SELECT serial, upc, man_date, location, product, created_by, created_date, serial from schema.table where rownum < 2";
string strInsert = "INSERT INTO schema.table (serial, upc, man_date, location, product, created_by, created_date, serial) VALUES (:serial, :upc, :man_date, :location, :product, :created_by, :created_date, :serial)";
string conStr = ConfigurationManager.ConnectionStrings["connection"].ConnectionString;
OracleConnection connection = new OracleConnection(conStr);
connection.Open();
if (connection.State != ConnectionState.Open)
{
    return;
}
try
{
    OracleDataAdapter adapterS = new OracleDataAdapter();
    adapterS.SelectCommand = new OracleCommand(strSelect, connection);
    adapterS.Fill(dt);
    dt.Rows.Remove(dt.Rows[0]);
    dt.Merge(dtUpload);
}
catch (Exception ex)
{
    string x = ex.Message + ex.StackTrace;
    throw;
}
for (int i = 0; dt.Rows.Count > i; i++)
{

    OracleDataAdapter adapter = new OracleDataAdapter();
    adapter.InsertCommand = new OracleCommand(strInsert, connection);
    adapter.InsertCommand.BindByName = true;

    OracleParameter pSerial = new OracleParameter(":serial", OracleDbType.Varchar2);
    pSerial.SourceColumn = dt.Columns[0].ColumnName;
    pSerial.Value = dtUpload.Rows[i][0];

    OracleParameter pLocation = new OracleParameter(":location", OracleDbType.Varchar2);
    pLocation.SourceColumn = dt.Columns[1].ColumnName;
    pLocation.Value = dtUpload.Rows[i][1];

    OracleParameter pUPC = new OracleParameter(":upc", OracleDbType.Date);
    pUPC.SourceColumn = dt.Columns[2].ColumnName;
    pUPC.Value = dtUpload.Rows[i][2];

    OracleParameter pProduct = new OracleParameter(":product", OracleDbType.Varchar2);
    pProduct.SourceColumn = dt.Columns[3].ColumnName;
    pProduct.Value = dtUpload.Rows[i][3];

    OracleParameter pCreatedBy = new OracleParameter(":created_by", OracleDbType.Varchar2);
    pCreatedBy.SourceColumn = dt.Columns[4].ColumnName;
    pCreatedBy.Value = dtUpload.Rows[i][4];

    OracleParameter pCreatedDate = new OracleParameter(":created_date", OracleDbType.Varchar2);
    pCreatedDate.SourceColumn = dt.Columns[5].ColumnName;
    pCreatedDate.Value = dtUpload.Rows[i][5];

    OracleParameter pSKU = new OracleParameter(":SKU", OracleDbType.Date);
    pSKU.SourceColumn = dt.Columns[6].ColumnName;
    pSKU.Value = dtUpload.Rows[i][6];

    OracleParameter pManDate = new OracleParameter(":man_date", OracleDbType.Varchar2);
    pManDate.SourceColumn = dt.Columns[7].ColumnName;
    pManDate.Value = dtUpload.Rows[i][7];

    adapter.InsertCommand.Parameters.Add(pSerial);
    adapter.InsertCommand.Parameters.Add(pLocation);
    adapter.InsertCommand.Parameters.Add(pUPC);
    adapter.InsertCommand.Parameters.Add(pProduct);
    adapter.InsertCommand.Parameters.Add(pCreatedBy);
    adapter.InsertCommand.Parameters.Add(pCreatedDate);
    adapter.InsertCommand.Parameters.Add(pserial);
    adapter.InsertCommand.Parameters.Add(pManDate);
}
try
{
    adapter.Update(dt);
}
catch (Exception ex)
{
    string x = ex.Message + ex.StackTrace;
    throw;
}
connection.Close();
connection.Dispose();

使用方法:

function myIntersect($a, $b) {
    foreach ($a as $x) {
        $i = array_search($x, $b);
        if ($i !== false) {
            $c[] = $x;
            unset($b[$i]);
        }
    }
    return $c;
}

说明

我们的想法是从第一个数组中获取每个值,并在第二个数组中找到它出现的第一个位置。如果找到,则将其复制到结果中,第二个数组中的匹配值将在找到的位置被删除,因此无法再次匹配。

  1. $arrayone = array("3", "2", "1", "2", "3"); $arraytwo = array("1", "2", "3", "2", "1"); $result = myIntersect($arrayone, $arraytwo); print_r($result); // ["3", "2", "1", "2"] $ x 是第一个数组的值
  2. foreach ($a as $x) { ... } $ i 是第二个数组中值发生的第一个位置,如果找不到, $ i 为{{1} }
  3. $i = array_search($x, $b);:如果搜索成功...
    • false:然后将值添加到结果数组 $ c 和...
    • if ($i !== false) {:...将其从 $ b 中的找到位置移除。请注意,在PHP中,传递给函数的数组实际上是原始数组的副本,因此这样的删除对传递给函数的原始数组没有影响。
  4. 对第一个数组中的所有值重复上述步骤
  5. $c[] = $x;:将结果数组返回给调用者