如何在现有数组数组

时间:2015-07-08 08:40:54

标签: php arrays

我不确定这个标题在我的案例中是否可以理解,因为我仍被认为是PHP中的noob。

这是我的代码

// An object has property e.g. (ID, Name, Status)
// This function returns an array of object.
function getObjects ($pid) { //return objects }

$pids = { 2, 23, 41, 45, 56, 91, 105, 107, 210 };

$myArr = array();

foreach ($pids as $pid)
{
  $myObjects = getObjects($pid);

  if (count($myObjects) > 0)
  {
    array_push($myArr, $myObjects);
  }
}

if ( count($myArr) > 0 )
{
  $result = "You have " . count($myArr) . " pending object";
}

因此,在 $ myArr 中,有 $ myObjects 数组的集合,每个 < em> $ myObjects 数组包含 $ myObject

问题是,在 $ myArr 中,我不希望有任何类似的 $ myObject (假设没有多个相同的ID)。

目前, $ result 是..

  

您有4个待处理对象

目前在我的实际应用中, $ pids $ myArr 包含 < em> 4个$ myObjects ,其中每个 $ myObjects 只包含 $ myObject中的1个 具有相同的 ID

由于他们的 ID 有相似之处,我希望 $ result

  

您有1个待处理对象

对于糟糕的解释我很抱歉,我希望到目前为止我已经非常清楚了。

修改

    $arrDraftLoadplans        = array();
    $arrDraftPickslips        = array();
    $arrDraftReplenishments   = array();
    $arrUncompletedWriteoffs  = array();
    $arrUncompletedASNs       = array();
    $arrDraftReplenishment    = array();

    $totalError = 0;
    $resultFormat = "</br><a href='%s'>%d %s</a>";

    $draftTRNs                = PutawayPeer::getPutawaysByProductIdAndStatus(null, Putaway::STATUS_DRAFT);
    if ( count ($draftTRNs) > 0 )
    {
      $result .= sprintf ($resultFormat, "../warehouseReturns/putawayList?principal_id=-1&refresh=Refresh", count ($draftTRNs), "Unconfirmed Putaway(s)");
      $totalError++;
    }

    foreach ($productIds as $pid)
    {
      $draftLoadplans       = LoadPlanPeer::getLoadplansByProductIdAndStatus($pid);
      if (count($draftLoadplans) > 0)
      {
        array_push($arrDraftLoadplans, $draftLoadplans);
      }

      $draftPickslips       = PickSlipPeer::getPickslipsByProductIdAndPicklistStatus($pid);
      if (count($draftPickslips) > 0)
      {
        array_push($arrDraftPickslips, $draftPickslips);
      }

      $draftReplenishments  = ReplenishmentPeer::getReplenishmentsByProductIdAndStatus($pid);
      if (count($draftReplenishments) > 0)
      {
        array_push($arrDraftReplenishments, $draftReplenishments);
      }

      $uncompletedWriteoffs = WriteOffPickslipPeer::getUnconfirmedWriteOffPickslipsByProductId($pid);
      if (count($uncompletedWriteoffs) > 0)
      {
        array_push($arrUncompletedWriteoffs, $uncompletedWriteoffs);
      }

      $uncompletedASNs      = AdvanceShippingNoticePeer::getAdvanceShippingNoticesByProductIdAndBetweenStatus($pid);
      if (count($uncompletedASNs) > 0)
      {
        array_push($arrUncompletedASNs, $uncompletedASNs);
      }
    }


    if (count($arrDraftLoadplans) > 0)
    {
      $result .= sprintf ($resultFormat, "../warehouseOutbound/outPickrelease", count ($arrDraftLoadplans), "Pending Loadplan(s)");
      $totalError++;
    }

    if (count($arrDraftPickslips) > 0)
    {
      $result .= sprintf ($resultFormat, "../warehouseOutbound/outPicking", count ($arrDraftPickslips), "Pending Pickslip(s)");
      $totalError++;
    }

    if (count($arrDraftReplenishment) > 0)
    {
      $result .= sprintf ($resultFormat, "../inventoryStockReplenishment/replenishmentList", count ($arrDraftReplenishment), "Pending Replenishment(s)");
      $totalError++;
    }

    if (count($arrUncompletedWriteoffs) > 0)
    {
      $result .= sprintf ($resultFormat, "../warehouseReturns/writeOffPickslipList", count ($arrUncompletedWriteoffs), "Pending Write-Off(s)");
      $totalError++;
    }

    if (count($arrUncompletedASNs) > 0)
    {
      $result .= sprintf ($resultFormat, "#", count ($arrUncompletedASNs), "Pending ASN(s)");
      $totalError++;
    }

2 个答案:

答案 0 :(得分:1)

那些 $ myObjects 具有可能相同ID的不同对象,或者可能是具有相同ID的相同对象?

如果你只是想删除重复项,你可以例如展平你的阵列(使其成为一维),然后删除重复项。

// flatten array
$flattenedArray = array_reduce($myArr, 'array_merge', array());
// remove duplicates
$myNewArr = array_unique($flattenedArray);

虽然我没有对此进行过测试,但它应该适用于所描述的情况。

答案 1 :(得分:1)

这有助于您最终获得仅填充唯一对象的数组。

<?php 
// An object has property e.g. (ID, Name, Status)
// This function returns an array of object.
function getObjects($pid) {
    //return objects     
}

$pids = array(2, 23, 41, 45, 56, 91, 105, 107, 210);

$myArr = array();
$usedIds = array();

foreach ($pids as $pid) {
    $myObjects = getObjects($pid);

    if (count($myObjects) > 0) {
        foreach($myObjects as $myObj){
            if(!in_array($myObj->ID, $usedIds)){
                $usedIds = $myObj->ID;
                $myArr[] = $myObj;
            }
        }
    }
}

if (count($myArr) > 0) {
    $result = "You have " . count($myArr) . " pending object(s)";
}