আপনি কীভাবে পিএইচপি-তে কোনও অ্যারেটিকে পুনর্নির্মাণ করবেন?


156

আমার কাছে নিম্নলিখিত অ্যারে রয়েছে, যা আমি পুনর্নির্দেশনা করতে চাই যাতে কীগুলি বিপরীত হয় (আদর্শভাবে 1 থেকে শুরু হয়):

বর্তমান অ্যারে ( সম্পাদনা: অ্যারেটি আসলে এরকম দেখাচ্ছে):

Array (

[2] => Object
    (
        [title] => Section
        [linked] => 1
    )

[1] => Object
    (
        [title] => Sub-Section
        [linked] => 1
    )

[0] => Object
    (
        [title] => Sub-Sub-Section
        [linked] => 
    )

)

কিভাবে এটি করা উচিত:

Array (

[1] => Object
    (
        [title] => Section
        [linked] => 1
    )

[2] => Object
    (
        [title] => Sub-Section
        [linked] => 1
    )

[3] => Object
    (
        [title] => Sub-Sub-Section
        [linked] => 
    )

)

1
বিপরীত কিছু আছে কোথায়?
গম্বো

আমার উদাহরণটি প্রথম উদাহরণে দেখুন
মেলিয়াল

এবং কেন আপনার প্রথম এলিমেন্টের সূচক 1 হওয়ার দরকার? শুধু একটি বিন্যাস বিষয় বা অভ্যন্তরীণ প্রক্রিয়াকরণের জন্য?
গম্বো

এটি ইউআরএল সেগমেন্টটি পেতে ফাংশনের প্যারাম হিসাবে ব্যবহৃত হবে, get_url_seament (1) এর মতো কিছু এই পৃষ্ঠায় "প্রশ্নগুলি" যেমন ফিরে আসবে
মেলা

উত্তর:


444

আপনি যদি শূন্য থেকে শুরু করে পুনরায় সূচি করতে চান তবে কেবল নিম্নলিখিতটি করুন:

$iZero = array_values($arr);

আপনার যদি এটি একবারে শুরু করার প্রয়োজন হয় তবে নিম্নলিখিতগুলি ব্যবহার করুন:

$iOne = array_combine(range(1, count($arr)), array_values($arr));

ব্যবহৃত ফাংশনগুলির জন্য ম্যানুয়াল পৃষ্ঠাগুলি এখানে রয়েছে:


1
আপনার ব্যাপ্তি (0, গণনা (r অ্যারে) - 1) ব্যবহার করা উচিত যাতে আপনি একটি শূন্য-সূচকযুক্ত অ্যারে পান।
ম্যাক্স হার্টশর্ন

এটি দুর্দান্ত, বিকল্পভাবে আপনি শূন্য-সূচকযুক্ত উপাদান যুক্ত করতে অ্যারে_উন্সফ্ট ($ আরআর, '') ব্যবহার করে চেষ্টা করতে পারেন, তারপরে এটি সরিয়ে আনসেট ($ আরআর [0]) করতে পারেন, এইভাবে সমস্ত সূচি একের পর এক সরিয়ে নিয়ে যায়। এটি অ্যারে_কম্বাইন () এর চেয়ে দ্রুত হতে পারে। বা না :)
স্টিভ হরভথ 4

নোট করুন যে array_valuesঅ্যারের একটি অনুলিপি প্রদান করে। সুতরাং আপনার যদি অ্যারে রেফারেন্স থাকে তবে array_spliceআরও ভাল। @ আইম্যাগিরো সমাধান দেখুন।
নাক্স

array_values()আপনি যদি সর্বদা 0 সূচক দিয়ে শুরু করেন তবে কেবল এটিই কার্যকর করুন।
কিশোর

55

এখানে সেরা উপায় :

# Array
$array = array('tomato', '', 'apple', 'melon', 'cherry', '', '', 'banana');

যে ফিরে

Array
(
    [0] => tomato
    [1] => 
    [2] => apple
    [3] => melon
    [4] => cherry
    [5] => 
    [6] => 
    [7] => banana
)

এই করে

$array = array_values(array_filter($array));

আপনি এটি পেতে

Array
(
    [0] => tomato
    [1] => apple
    [2] => melon
    [3] => cherry
    [4] => banana
)

ব্যাখ্যা

array_values() : ইনপুট অ্যারের মানগুলি এবং সংখ্যা অনুসারে সূচকগুলি প্রদান করে।

array_filter(): একটি ব্যবহারকারী-সংজ্ঞায়িত ফাংশন একটি অ্যারের উপাদান ফিল্টার (ইউডিএফ যদি কেউ প্রদান করা হয় , ইনপুট টেবিলের সমস্ত এন্ট্রি মূল্যবান মিথ্যা মুছে ফেলা হবে ।)


3
আপনি যদি অর্ডারের বিষয়ে চিন্তা না করেন তবে আপনি কেবল ($ অ্যারে) বাছাই করতে পারেন;
পিটার এম এলিয়াস

array_filter()নমুনা তথ্য থেকে সম্পূর্ণ অপ্রাসঙ্গিক বলে মনে হচ্ছে।
মিকম্যাকুসা

13

আমি সবেমাত্র জানতে পেরেছিলাম যে আপনি এটিও করতে পারেন

array_splice($ar, 0, 0);

এটি পুনরায় সূচকে অন্তর্ভুক্ত করে, সুতরাং আপনি মূল অ্যারের অনুলিপিটি শেষ করবেন না।


9

পুনর্নির্মাণ কেন? কেবল সূচকে 1 যুক্ত করুন:

foreach ($array as $key => $val) {
    echo $key + 1, '<br>';
}

   প্রশ্নটি স্পষ্ট হওয়ার পরে সম্পাদনা করুন : আপনি array_valuesসূচকটি 0 থেকে শুরু করে পুনরায় সেট করতে ব্যবহার করতে পারেন Then তারপরে আপনি যদি প্রিন্ট উপাদানগুলি 1 থেকে শুরু করতে চান তবে আপনি উপরের অ্যালগরিদমটি ব্যবহার করতে পারেন।


এই প্রশ্নের
আন্ডাররেটেড

6

ঠিক আছে, আমি ভাবতে চাই যে আপনার শেষ লক্ষ্য যাই হোক না কেন, আপনাকে 0-ভিত্তিক বিপরীতে 1-ভিত্তিক হওয়ার জন্য অ্যারেটি সংশোধন করার দরকার নেই, তবে এটি গম্বোর পোস্টের মতো পুনরাবৃত্তির সময়ে এটি পরিচালনা করতে পারে।

তবে আপনার প্রশ্নের উত্তর দেওয়ার জন্য, এই ক্রিয়াকলাপটি যে কোনও অ্যারেটিকে 1-ভিত্তিক সংস্করণে রূপান্তর করবে

function convertToOneBased( $arr )
{
    return array_combine( range( 1, count( $arr ) ), array_values( $arr ) );
}

সম্পাদনা

এখানে আরও পুনরায় ব্যবহারযোগ্য / নমনীয় ফাংশন রয়েছে, আপনার যদি এটি পছন্দ করা উচিত

$arr = array( 'a', 'b', 'c' );

echo '<pre>';
print_r( reIndexArray( $arr ) );
print_r( reIndexArray( $arr, 1 ) );
print_r( reIndexArray( $arr, 2 ) );
print_r( reIndexArray( $arr, 10 ) );
print_r( reIndexArray( $arr, -10 ) );
echo '</pre>';

function reIndexArray( $arr, $startAt=0 )
{
    return ( 0 == $startAt )
        ? array_values( $arr )
        : array_combine( range( $startAt, count( $arr ) + ( $startAt - 1 ) ), array_values( $arr ) );
}

5

এটি আপনি যা চান তা করবে:

<?php

$array = array(2 => 'a', 1 => 'b', 0 => 'c');

array_unshift($array, false); // Add to the start of the array
$array = array_values($array); // Re-number

// Remove the first index so we start at 1
$array = array_slice($array, 1, count($array), true);

print_r($array); // Array ( [1] => a [2] => b [3] => c ) 

?>

5

আপনি কেন 1-ভিত্তিক অ্যারে ব্যবহার করতে চান তা বিবেচনা করতে পারেন want শূন্য-ভিত্তিক অ্যারেগুলি (অ-অ্যাসোসিয়েটিভ অ্যারেগুলি ব্যবহার করার সময়) বেশ মানসম্পন্ন এবং আপনি যদি কোনও ইউআইতে আউটপুট পেতে চান তবে বেশিরভাগ সমাধানটি কেবলমাত্র ইউআইতে আউটপুট নেওয়ার পরে পূর্ণসংখ্যা বাড়িয়ে সমাধান করতে পারে।

অ্যারেগুলির জন্য 1-ভিত্তিক সূচকগুলির বিষয়ে চিন্তা করার সময় আপনার অ্যাপ্লিকেশনটিতে এবং আপনি যে কোডটি দিয়ে কাজ করেন সেটিতেই ধারাবাহিকতা সম্পর্কে চিন্তাভাবনা করুন।


2
এটি সরাসরি ব্যবসায়ের স্তর এবং উপস্থাপনা স্তরের মধ্যে পৃথকীকরণের সাথে সম্পর্কিত। আপনি যদি উপস্থাপনের জন্য আপনার যুক্তিতে কোড পরিবর্তন করছেন তবে আপনি খারাপ কাজ করছেন। উদাহরণস্বরূপ, আপনি যদি কোনও নিয়ামকের জন্য এটি করেন তবে হঠাৎ আপনার নিয়ামক একটি নির্দিষ্ট ভিউ রেন্ডারারের সাথে আবদ্ধ হয়ে যান বরং যে কোনও ভিউ রেন্ডারারের জন্য এটি ব্যবহার করতে পারেন তার জন্য ডেটা প্রস্তুত করে (পিএইচপি, জসন, এক্সএমএল, আরএসএস)
ট্রেস


5

আপনি একটি অ্যারের পুনর্নির্মাণ করতে পারেন যাতে নতুন অ্যারে 1 এর সূচক দিয়ে শুরু হয়;

$arr = array(
  '2' => 'red',
  '1' => 'green',
  '0' => 'blue',
);

$arr1 = array_values($arr);   // Reindex the array starting from 0.
array_unshift($arr1, '');     // Prepend a dummy element to the start of the array.
unset($arr1[0]);              // Kill the dummy element.

print_r($arr);
print_r($arr1);

উপরের থেকে আউটপুট হয়;

Array
(
    [2] => red
    [1] => green
    [0] => blue
)
Array
(
    [1] => red
    [2] => green
    [3] => blue
)

আপনি array_valuesএখানে ব্যবহার করতে হবে না । আমার উত্তর দেখুন।
বৃষ্টি

4

@ মোমেনওয়াকারের মতো, আমার কোনও অবজেক্টের কী ব্যবহার করে একটি অ্যারের পুনর্নির্মাণ করা দরকার ...

$new = array();
$old = array(
  (object)array('id' => 123),
  (object)array('id' => 456),
  (object)array('id' => 789),
);
print_r($old);

array_walk($old, function($item, $key, &$reindexed_array) {
  $reindexed_array[$item->id] = $item;
}, &$new);

print_r($new);

এর ফলস্বরূপ:

Array
(
    [0] => stdClass Object
        (
            [id] => 123
        )
    [1] => stdClass Object
        (
            [id] => 456
        )
    [2] => stdClass Object
        (
            [id] => 789
        )
)
Array
(
    [123] => stdClass Object
        (
            [id] => 123
        )
    [456] => stdClass Object
        (
            [id] => 456
        )
    [789] => stdClass Object
        (
            [id] => 789
        )
)


3

আপনি যদি অ্যারেটিকে পুনরায় অর্ডার করার চেষ্টা না করেন তবে আপনি কেবল এটি করতে পারেন:

$ অ্যারে = অ্যারে_ রিভার্স ($ অ্যারে);
$ অ্যারে = অ্যারে_ রিভার্স ($ অ্যারে);

অ্যারে_রেভার খুব দ্রুত এবং এটি বিপরীত হওয়ার সাথে সাথে তা পুনরায় অর্ডার করে। অন্য কেউ আমাকে এটি অনেক আগে দেখিয়েছিল। সুতরাং এটির সাথে আসার জন্য আমি কৃতিত্ব নিতে পারি না। তবে এটি খুব সহজ এবং দ্রুত।


2

নিকের অবদানের অনুরূপ, আমি অ্যারে পুনর্নির্মাণের জন্য একই সমাধানে এসেছি, তবে পিএইচপি সংস্করণ 5.4 থেকে ফাংশনটি কিছুটা বাড়িয়েছি, কারণ রেফারেন্স অনুসারে ভেরিয়েবলগুলি পাস করার কারণে এটি কাজ করে না। উদাহরণস্বরূপ reindexing ফাংশনটি useকীওয়ার্ড ক্লোজার ব্যবহার করে এর পরে:

function indexArrayByElement($array, $element)
{
    $arrayReindexed = [];
    array_walk(
        $array,
        function ($item, $key) use (&$arrayReindexed, $element) {
            $arrayReindexed[$item[$element]] = $item;
        }
    );
    return $arrayReindexed;
}

1

এখানে আমার নিজস্ব বাস্তবায়ন। ইনপুট অ্যারেগুলির কীগুলি $ start_index থেকে শুরু করে ইনক্রিমেন্টিং কীগুলির সাথে পুনর্নবীকরণ করা হবে।

function array_reindex($array, $start_index)
{
    $array = array_values($array);
    $zeros_array = array_fill(0, $start_index, null);
    return array_slice(array_merge($zeros_array, $array), $start_index, null, true);
}


1

আপনি খালি অ্যারে উপাদানগুলি অপসারণ করতে এবং পিএইচপি-তে একটি অ্যারে থেকে পুনঃনির্দেশনাটি একসাথে অ্যারে_ভ্যালু () এবং অ্যারে_ফিল্টার () ফাংশন ব্যবহার করার পরে এটি সহজেই করতে পারেন।

অ্যারে_ফিল্টার () ফাংশন পিএইচপি অ্যারে_ফিল্টার () ফাংশন পিএইচপি-তে একটি অ্যারে থেকে খালি অ্যারে উপাদান বা মানগুলি সরিয়ে দেয়। এটি খালি, নাল, মিথ্যা, 0 (শূন্য) মানগুলিও সরিয়ে ফেলবে।

অ্যারে_ভ্যালু () ফাংশন পিএইচপি অ্যারে_ভ্যালু () ফাংশনটি অ্যারের সমস্ত মান সহ একটি অ্যারে প্রদান করে। ফিরে আসা অ্যারেতে সংখ্যাগুলি কী থাকবে, 0 থেকে শুরু হয়ে 1 টি বৃদ্ধি পাবে।

খালি অ্যারে এলিমেন্টস এবং রিইনডেক্স সরান

প্রথমে $ স্ট্যাক অ্যারের আউটপুটটি দেখুন:

<?php
  $stack = array("PHP", "HTML", "CSS", "", "JavaScript", null, 0);
  print_r($stack);
?>

আউটপুট:

Array
(
    [0] => PHP
    [1] => HTML
    [2] => CSS
    [3] => 
    [4] => JavaScript
    [5] => 
    [6] => 0
)

উপরের আউটপুটে আমরা ফাঁকা, নাল, 0 (শূন্য) মানগুলি মুছে ফেলতে চাই এবং তারপরে অ্যারে উপাদানগুলিকে পুনরায় পাঠাতে পারি। এখন আমরা নীচের উদাহরণের মতো অ্যারে_ভ্যালু () এবং অ্যারে_ফিল্টার () ফাংশনটি একসাথে ব্যবহার করব:

<?php
  $stack = array("PHP", "HTML", "CSS", "", "JavaScript", null, 0);
  print_r(array_values(array_filter($stack)));
?>

আউটপুট:

Array
(
    [0] => PHP
    [1] => HTML
    [2] => CSS
    [3] => JavaScript
)

array_filter()ওপির নমুনা তথ্যের সাথে সম্পূর্ণ অপ্রাসঙ্গিক বলে মনে হচ্ছে।
মিকম্যাকুসা

1

সদৃশ অপসারণ এবং একটি অ্যারের পুনর্নির্মাণ:

<?php  
   $oldArray = array('0'=>'php','1'=>'java','2'=>'','3'=>'asp','4'=>'','5'=>'mysql');
   //duplicate removal
   $fillteredArray = array_filter($oldArray);
   //reindexing actually happens  here
   $newArray = array_merge($filteredArray);
   print_r($newArray);
?>

array_filter()ওপির নমুনা তথ্যের সাথে সম্পূর্ণ অপ্রাসঙ্গিক বলে মনে হচ্ছে।
মিকম্যাকুসা

1

আমি সবচেয়ে দ্রুত উপায়টি ভাবতে পারি

array_unshift($arr, null);
unset($arr[0]);
print_r($arr);

এবং যদি আপনি কেবল অ্যারেটিকে পুনরায় তালিকাবদ্ধ করতে চান (শূন্য থেকে শুরু করুন) এবং আপনার পিএইচপি +7.3 রয়েছে আপনি এটি এইভাবে করতে পারেন

array_unshift($arr);

আমি বিশ্বাস করি এর array_unshiftচেয়ে ভাল array_valuesযেহেতু প্রাক্তন অ্যারের একটি অনুলিপি তৈরি করে না।


0

দেখে মনে হচ্ছে array_combine()উত্তরগুলির সমস্তগুলি একই "ভুল" অনুলিপি করছে (অপ্রয়োজনীয় কল array_values())।

array_combine() এটি প্রাপ্ত উভয় পরামিতিগুলির কীগুলি উপেক্ষা করে।

কোড: ( ডেমো )

$array = [
    2 => (object)['title' => 'Section', 'linked' => 1],
    1 => (object)['title' => 'Sub-Section', 'linked' => 1],
    0 => (object)['title' => 'Sub-Sub-Section', 'linked' => null]
];

var_export(array_combine(range(1, count($array)), $array));

আউটপুট:

array (
  1 => 
  (object) array(
     'title' => 'Section',
     'linked' => 1,
  ),
  2 => 
  (object) array(
     'title' => 'Sub-Section',
     'linked' => 1,
  ),
  3 => 
  (object) array(
     'title' => 'Sub-Sub-Section',
     'linked' => NULL,
  ),
)

0

বাছাই করা কেবল একটি সাজান () , পুনর্নির্মাণটি কিছুটা নির্বোধ মনে হয় তবে এটির প্রয়োজন হলে এটি এটি করবে। যদিও জায়গায় নেই। অ্যারে_ওয়াক () ব্যবহার করুন যদি আপনি এটি বেশ কয়েকটি জায়গায় করে থাকেন, যদি এটি ওয়ান-টাইম ক্রিয়াকলাপ হয় তবে কেবলমাত্র একটি-জন্য-মান লুপ ব্যবহার করুন।

<?php

function reindex(&$item, $key, &$reindexedarr) {
    $reindexedarr[$key+1] = $item;
}

$arr = Array (2 => 'c', 1 => 'b', 0 => 'a');

sort($arr);
$newarr = Array();
array_walk($arr, reindex, &$newarr);
$arr = $newarr;
print_r($arr); // Array ( [1] => a [2] => b [3] => c )

?>

-10

যদি নতুন অ্যারে করা ঠিক হয় তবে এটি এটি:

$result = array();
foreach ( $array as $key => $val )
    $result[ $key+1 ] = $val;

যদি আপনাকে জায়গায় জায়গায় বিপরীতমুখী হওয়া দরকার হয় তবে আপনার পিছনে দৌড়াতে হবে যাতে আপনার প্রয়োজনীয় সূচকগুলিতে স্টম্প না করে:

for ( $k = count($array) ; $k-- > 0 ; )
    $result[ $k+1 ] = $result[ $k ];
unset( $array[0] );   // remove the "zero" element

20
এই সমস্যার কোনও উত্তরের জন্য একটি লুপের প্রয়োজন হবে না। উত্তরের মূল অংশটি array_values()0-ভিত্তিক অ্যারে পেতে ব্যবহার করা হয় এবং যদি 1-ভিত্তিক অ্যারেটি সত্যই প্রয়োজন হয় তবে সেই ফলাফলটিতে কিছুটা সামঞ্জস্য করে ।
গ্র্যান্টপর্পস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.