繁体   English   中英

Php Xml 数据不循环通过 foreach 循环中的元素

[英]Php Xml data not looping through elements in a foreach loop

我有一个通过 XML 文件运行的 foreach 循环。 尽管从 XML 文件中使用的数据始终是文件的第一部分,但循环正在正确计数并正确运行。 因此,它运行适量的循环,但对每个循环使用相同的传递数据。

这是我的代码:

我的 XML 档案

<?xml version="1.0" encoding="utf-8"?>
<Company xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Suppliers>
    <Supplier>
      <UniqueId>00001</UniqueId>
      <CompanyName>The test account</CompanyName>
      <AccountOpened>2021-08-04T00:00:00</AccountOpened>
      <AccountReference>PAYATEST</AccountReference>
      <VatNumber />
      <CreditLimit>0</CreditLimit>
      <Balance>0</Balance>
      <SupplierInvoiceAddress>
        <Title />
        <Forename />
        <Surname>gfrdg</Surname>
        <Company>Payables Test Account</Company>
        <Description>gfrdg - fg26 2re</Description>
        <Address1>12156</Address1>
        <Address2>bfbf</Address2>
        <Town>firgb</Town>
        <Postcode>fg26 2re</Postcode>
        <County>frjgb</County>
        <Country>GB</Country>
        <Telephone />
        <Fax />
        <Mobile />
        <Email>aaa@aaaa.com</Email>
        <Email2 />
        <Email3 />
        <Website />
        <Birthdate xsi:nil="true" />
        <Notes />
        <TaxCode>1</TaxCode>
        <TradeContact />
        <Activities />
        <Groups />
        <Roles />
      </SupplierInvoiceAddress>
      <SupplierDeliveryAddress>
        <Title />
        <Forename />
        <Surname>gfrdg</Surname>
        <Company />
        <Description>gfrdg - </Description>
        <Address1 />
        <Address2 />
        <Town />
        <Postcode />
        <County />
        <Country>GB</Country>
        <Telephone />
        <Fax />
        <Birthdate xsi:nil="true" />
        <Notes />
        <TaxCode>1</TaxCode>
        <Activities />
        <Groups />
        <Roles />
      </SupplierDeliveryAddress>
      <ChargeCredit xsi:nil="true" />
      <Currency>GBP</Currency>
      <TermsAgreed>true</TermsAgreed>
      <AccountOnHold xsi:nil="true" />
      <IsActive>true</IsActive>
      <AccountStatus>0</AccountStatus>
      <Priority>true</Priority>
      <NominalCode>5000</NominalCode>
      <DepartmentInfo>
        <Reference>0</Reference>
        <Name>Default</Name>
        <Number xsi:nil="true" />
      </DepartmentInfo>
      <FixedDiscount>0</FixedDiscount>
      <Analysis1 />
      <Analysis2 />
      <Analysis3 />
      <Memo />
      <OverrideNominalCode xsi:nil="true" />
      <OverrideTaxCode>false</OverrideTaxCode>
      <PaymentDays>30</PaymentDays>
      <PaymentDueFrom>DaysAfterInvoiceDate</PaymentDueFrom>
      <RestrictMailing xsi:nil="true" />
      <SendElectronicInvoice xsi:nil="true" />
      <SendElectronicLetter>false</SendElectronicLetter>
      <SettlementDays>30</SettlementDays>
      <SettlementDiscount>0</SettlementDiscount>
      <Terms />
      <Contacts />
      <TaxCode>0</TaxCode>
      <PaymentGroup xsi:nil="true" />
      <Banks>
        <Bank>
          <BankName />
          <Address1 />
          <Address2 />
          <Town />
          <County />
          <Postcode />
          <AccountName />
          <SortCode />
          <AccountNumber />
          <BACSRef />
          <IBAN />
          <BICSwift />
          <RollNumber />
          <AdditionalRef1 />
          <AdditionalRef2 />
          <AdditionalRef3 />
          <OnlineReceipts>false</OnlineReceipts>
        </Bank>
      </Banks>
    </Supplier>
  </Suppliers>
  <Suppliers>
    <Supplier>
      <UniqueId>00002</UniqueId>
      <CompanyName>The other test account</CompanyName>
      <AccountOpened>2021-08-04T00:00:00</AccountOpened>
      <AccountReference>PAYATEST</AccountReference>
      <VatNumber />
      <CreditLimit>0</CreditLimit>
      <Balance>0</Balance>
      <SupplierInvoiceAddress>
        <Title />
        <Forename />
        <Surname>gfrdg</Surname>
        <Company>Another Test Account</Company>
        <Description>gfrdg - fg26 2re</Description>
        <Address1>12156</Address1>
        <Address2>bfbf</Address2>
        <Town>firgb</Town>
        <Postcode>fg26 2re</Postcode>
        <County>frjgb</County>
        <Country>GB</Country>
        <Telephone />
        <Fax />
        <Mobile />
        <Email>xxx@xxx.com</Email>
        <Email2 />
        <Email3 />
        <Website />
        <Birthdate xsi:nil="true" />
        <Notes />
        <TaxCode>1</TaxCode>
        <TradeContact />
        <Activities />
        <Groups />
        <Roles />
      </SupplierInvoiceAddress>
      <SupplierDeliveryAddress>
        <Title />
        <Forename />
        <Surname>gfrdg</Surname>
        <Company />
        <Description>gfrdg - </Description>
        <Address1 />
        <Address2 />
        <Town />
        <Postcode />
        <County />
        <Country>GB</Country>
        <Telephone />
        <Fax />
        <Birthdate xsi:nil="true" />
        <Notes />
        <TaxCode>1</TaxCode>
        <Activities />
        <Groups />
        <Roles />
      </SupplierDeliveryAddress>
      <ChargeCredit xsi:nil="true" />
      <Currency>GBP</Currency>
      <TermsAgreed>true</TermsAgreed>
      <AccountOnHold xsi:nil="true" />
      <IsActive>true</IsActive>
      <AccountStatus>0</AccountStatus>
      <Priority>true</Priority>
      <NominalCode>5000</NominalCode>
      <DepartmentInfo>
        <Reference>0</Reference>
        <Name>Default</Name>
        <Number xsi:nil="true" />
      </DepartmentInfo>
      <FixedDiscount>0</FixedDiscount>
      <Analysis1 />
      <Analysis2 />
      <Analysis3 />
      <Memo />
      <OverrideNominalCode xsi:nil="true" />
      <OverrideTaxCode>false</OverrideTaxCode>
      <PaymentDays>30</PaymentDays>
      <PaymentDueFrom>DaysAfterInvoiceDate</PaymentDueFrom>
      <RestrictMailing xsi:nil="true" />
      <SendElectronicInvoice xsi:nil="true" />
      <SendElectronicLetter>false</SendElectronicLetter>
      <SettlementDays>30</SettlementDays>
      <SettlementDiscount>0</SettlementDiscount>
      <Terms />
      <Contacts />
      <TaxCode>0</TaxCode>
      <PaymentGroup xsi:nil="true" />
      <Banks>
        <Bank>
          <BankName />
          <Address1 />
          <Address2 />
          <Town />
          <County />
          <Postcode />
          <AccountName />
          <SortCode />
          <AccountNumber />
          <BACSRef />
          <IBAN />
          <BICSwift />
          <RollNumber />
          <AdditionalRef1 />
          <AdditionalRef2 />
          <AdditionalRef3 />
          <OnlineReceipts>false</OnlineReceipts>
        </Bank>
      </Banks>
    </Supplier>
  </Suppliers>
</Company>

我的代码:

$dom = new \DOMDocument;
            $dom->loadXml($request->get('data'));
            $supplier_count = $dom->getElementsByTagName('Supplier')->length;

            if ($supplier_count > 0) {
                
                foreach($dom->getElementsByTagName('Supplier') as $index => $supplier) {
                    
                    $dataArray = array(
                        'reference' => $supplier->getElementsByTagName('AccountReference')->item(0)->nodeValue,
                        'name' => $supplier->getElementsByTagName('CompanyName')->item(0)->nodeValue,
                        'email' => $supplier->getElementsByTagName('Email')->item(0)->nodeValue,
                        'address' => array(
                            'street_1' => $supplier->getElementsByTagName('SupplierInvoiceAddress')->item(0)->getElementsByTagName('Address1')->item(0)->nodeValue,
                            'street_2' => $supplier->getElementsByTagName('SupplierInvoiceAddress')->item(0)->getElementsByTagName('Address2')->item(0)->nodeValue,
                            'town' => $supplier->getElementsByTagName('SupplierInvoiceAddress')->item(0)->getElementsByTagName('Town')->item(0)->nodeValue,
                            'post_code' => $supplier->getElementsByTagName('SupplierInvoiceAddress')->item(0)->getElementsByTagName('Postcode')->item(0)->nodeValue,
                            'county' => $supplier->getElementsByTagName('SupplierInvoiceAddress')->item(0)->getElementsByTagName('County')->item(0)->nodeValue,
                            'country' => $supplier->getElementsByTagName('SupplierInvoiceAddress')->item(0)->getElementsByTagName('Country')->item(0)->nodeValue,
                            'telephone' => $supplier->getElementsByTagName('SupplierInvoiceAddress')->item(0)->getElementsByTagName('Telephone')->item(0)->nodeValue
                        )
                    );
                    
                    if ($account = Account::where('reference', $dataArray['reference'])->first()) {

                        $rules = array(
                            'reference' => 'required|unique:accounts,reference,'.$account->id.',id',
                            'name' => 'required',
                            'email' => 'required|email|unique:users,email,'.$account->id.',account_id'
                        );

                        $messages = array(
                            'reference.required' => 'The company account reference is required.',
                            'reference.unique' => 'This company account reference already exists.',
                            'name.required' => 'The company name is required.',
                            'email.required' => 'The company must have a valid email address',
                            'email.email' => 'The email address for this company is not valid.',
                            'email.unique' => 'The email address for this company already exists.'
                        );

                        $validator = Validator::make($dataArray, $rules, $messages);

                        if ($validator->passes()) {
                            
                            $account = Account::find($account->id);
                            $account->name = $dataArray['name'];
                            $account->save();

                            // Save the address
                            $address = Address::where('account_id', $account->id)->first();
                            if($address) {
                                $address->street_1 = $dataArray['address']['street_1'];
                                $address->street_2 = $dataArray['address']['street_2'];
                                $address->town = $dataArray['address']['town'];
                                $address->county = $dataArray['address']['county'];
                                $address->post_code = $dataArray['address']['post_code'];
                                $address->telephone = $dataArray['address']['telephone'];                                    
                                $address->save();
                            }

                            // Create a user
                            $user = User::where('account_id', $account->id)->first();
                            $user->email = $dataArray['email'];
                            $user->name = $dataArray['name'];
                            $user->save();

                            return array('Updated Successfully!');

                        } else {

                            // Report error
                            $messages = $validator->messages();
                            return $messages->all();

                        }

                    }  else {

                        // Set field rules
                        $rules = array(
                            'reference' => 'required|unique:accounts',
                            'name' => 'required',
                            'email' => 'required|email|unique:users'
                        );

                        $messages = array(
                            'reference.required' => 'The company account reference is required.',
                            'reference.unique' => 'This company account reference already exists.',
                            'name.required' => 'The company name is required.',
                            'email.required' => 'The company must have a valid email address',
                            'email.email' => 'The email address for this company is not valid.',
                            'email.unique' => 'The email address for this company already exists.'
                        );

                        $validator = Validator::make($dataArray, $rules, $messages);

                        if ($validator->passes()) {

                            $dataArray['password'] = substr(str_shuffle(sha1($dataArray['email'].spl_object_hash($this).microtime(true))), 0, 10);

                            // Create account
                            $account = new Account;
                            $account->reference = $dataArray['reference'];
                            $account->name = $dataArray['name'];
                            $account->save();

                            // Save the address
                            
                            $address = new Address;
                            $address->account_id = $account->id;
                            $address->street_1 = $dataArray['address']['street_1'];
                            $address->street_2 = $dataArray['address']['street_2'];
                            $address->town = $dataArray['address']['town'];
                            $address->county = $dataArray['address']['county'];
                            $address->post_code = $dataArray['address']['post_code'];
                            $address->telephone = $dataArray['address']['telephone'];                                
                            $country = Country::where('code', $dataArray['address']['country'])->get()->first();
                            $address->country_id = $country->id;
                            $address->default_tax_code = '0';
                            $address->save();

                            $account->default_address_id = $address->id;
                            $account->save();
                            
                            // Create a user
                            $user = new User;
                            $user->email = $dataArray['email'];
                            $user->password = Hash::make($dataArray['password']);
                            $user->account_id = $account->id;
                            $user->active = 1;
                            $user->name = $dataArray['name'];
                            $user->save();

                            DB::table('role_user')->insert(['role_id' => 2, 'user_id' => $user->id]); 

                            

                            $name = $dataArray['name'];
                            $email = $dataArray['email'];

                            $details = [
                                'name' => $name,
                                'email' => $email,
                                'password' => $dataArray['password'],
                            ];
                            $subject = 'Account Creation Successful!';
                            $from_email = 'noreply@clarion-uk.com';
                            $from_name = 'Clarion';

                            Mail::to($email)->send(new NewAccountEmail($details, $subject, $from_email, $from_name));

                            $re_name = $dataArray['name'];
                            return array($re_name.' - Created Successfully!');

                        } else {

                            // Report error
                            $messages = $validator->messages();
                            return $messages->all();

                        } 
                    }
                    

                }

                return 'Data saved successfully!';
            } 

结果是“UniqueId”00001 数据在我的数据库中更新了两次,foreach 循环没有获取“UniqueId”00002 的数据。

任何帮助将不胜感激。 谢谢。

修理它!!! 这是怎么回事

错误在于我如何返回每个结果或验证错误。 我在每个循环中使用:'return'(你可以在我上面的代码中看到这一点),它停止了循环,因为当它返回一些东西时它停止了。

所以我所做的是在我的循环之前创建和排列,并且在每个循环中我将我的结果添加到数组中并且当所有循环完成时我只是返回数组。

这是一个简单的方法...

$results= array();

foreach ($a as $b) {
    $results[] = 'This loops result';
}

return $results;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM